Эй, все. Я вычисляю угол между двумя векторами, а иногда 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;
}
}
nitpick: условие вне пределов должно быть записано: '(-1> input || input> 1)' или даже '! (- 1 <= input && input <= 1)'. – MatrixFrog
Но пара (широта, долгота) не является двумерным вектором, они представляют собой измерения угла в 3D. Итак, что вы пытаетесь найти? Возможно, внутренний угол в центре земли или подшипник между ними? Эта формула тоже не поможет. –
Кроме того, что такое «От»? Для объекта 2D Vector вы ожидаете, что он будет содержать значения x и y, а метод Dot будет именно этим. X * другой.X + это.Y * прочее.Y. Вы также ожидаете, что метод Len просто вернет sqrt (x * x + y * y), а не какое-то значение, вычисленное из чего-то другого. –