2

やあみんな。2つのベクトル間の角度を計算していますが、Math.Acos()は、入力がコサインの範囲外(-1> input && input> 1)の場合にNaNを返すことがあります。正確にはどういう意味ですか?誰かが何が起こっているのか説明できるでしょうか?どんな助けでも大歓迎です!

これが私の方法です:

 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;
        }
    }
4

3 に答える 3

2

角度のCosは常に-1と+1の間にあるため、その範囲外の値の逆関数(Acos)を計算する方法はありません。または、NaNをACos関数に渡したことを意味します。

この場合は後者だと思います-あなたの長さの1つはおそらくゼロです。

于 2010-04-19T00:06:50.680 に答える
2

divOperation<-1または>1であることが判明したベクトルがありますか?Dot次に、との実装を確認する必要があると思いますLen

于 2010-04-19T00:08:37.697 に答える
0

NaNは「数字ではない」という意味です。数学的には、[-1、1]の範囲外の数値のアークコサインを取得することはできません(または、取得できますが、結果は複雑です-覚えていません)。まったく数ではありません。

于 2010-04-19T00:05:35.677 に答える