Question

Salut à tous. Je le calcul de l'angle entre deux vecteurs, et parfois Math.acos () retourne NaN lorsque cette entrée est en dehors des limites (-1> && entrée input> 1) pour un cosinus. Qu'est-ce que ça veut dire exactement? Quelqu'un être en mesure d'expliquer ce qui se passe? Toute aide est appréciée!

Voici ma méthode:

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

Voici ma mise en œuvre de Dot et 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;
        }
    }
Était-ce utile?

La solution

Vous avez des vecteurs pour lesquels divOperation se révèle être <-1 ou> 1? Ensuite, je pense que vous devriez vérifier vos implémentations de Dot et Len.

Autres conseils

Etant donné que les cos de l'angle est toujours comprise entre -1 et +1, il n'y a aucun moyen pour calculer la fonction inverse (Acos) d'un extérieur de la valeur de cette plage OU cela signifie que vous avez passé NaN à la fonction ACos.

Je soupçonne que dans ce cas, il est celui-ci - un de vos longueurs est probablement nulle

.

NaN signifie "pas un nombre" . Mathématiquement, vous ne pouvez pas prendre le arccosine d'un nombre qui est en dehors de la plage [-1, 1] (ou peut-être vous pouvez, mais le résultat est complexe - je ne me souviens pas) donc le résultat d'essayer de le faire est aucun numéro du tout.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top