2010-11-12 24 views
2

Quelqu'un peut-il me désigner un bon exemple d'Atan2 défini en C# (ou quelque chose de vaguement proche de C#) qui n'utilise aucune méthode mathématique interne? C'est sur .NET Microframework, donc il n'y a pas une telle bibliothèque mathématique interne. J'ai déjà défini Sin()/Cos(), mais j'ai beaucoup de problèmes avec Atain2.Atan2 en C# (ou lanaguge similaire)

Il existe quelques bibliothèques mathématiques à diffusion dispersée dans NETMF, mais je les ai toutes trouvées défectueuses ou cassées. L'un des plus importants ne définissait même pas correctement l'IP!

+0

Quelle bibliothèque avait PI faux? –

+0

_J'ai déjà défini Sin()/Cos() _ ne sont-ils pas déjà dans le framework? http://msdn.microsoft.com/en-us/library/cc506479.aspx –

+0

Votre plate-forme cible dispose-t-elle d'une FPU? –

Répondre

3

Une implémentation devrait être assez simple en commençant par la définition sur Wikipedia/atan2 puis en utilisant le infinite series expansion of arctan on Wikipedia. Résumez simplement les termes de la série jusqu'à ce que le dernier terme soit assez petit pour votre application.
L'erreur est inférieure au dernier terme car il s'agit d'une fonction strictement décroissante.

Edit:
Depuis le cadre vous êtes .NET Micro vous pourriez être faible sur les ressources de calcul. En fonction de la précision requise, vous pouvez envisager de précalculer une table des valeurs cos, sin, atan2, etc. et simplement utiliser une recherche simple de la valeur la plus proche. D'un autre côté, cela gaspille de la mémoire si vous avez besoin d'une trop grande précision.

+0

J'ai effectivement besoin d'une bonne quantité de précision, donc une table de recherche ne fonctionnera pas. J'ai vraiment besoin de le calculer sur place. – chris12892

0

Avez-vous considéré/essayé l'implémentation de l'algorithme CORDIC? Cela vous permettra d'implémenter la fonction atan, à partir de laquelle il est facile de générer la fonction atan2. Pour l'algorithme CORDIC, une description est à Wikipedia et de meilleurs détails sont dans this paper. En outre, je vois un GPL C++ version of CORDIC au code sourceforge du projet de traitement du signal en utilisant C++ (SPUC). Il inclut la bibliothèque mathématique, mais pourrait être modifié pour éviter de le faire. Il y a un code listing pratique sur les koders si vous voulez voir le code. Si vous n'êtes pas concerné par la vitesse, avec une implémentation de atan (z) qui retourne des valeurs entre -pi/2 et pi/2 (ou -90 et 90), vous pouvez implémenter atan2 (y, x) en retournant valeurs entre 0 et 2pi (ou 360) facilement. Voici par exemple pseudocode:

atan2(y,x){ 
    if (x < 0){ 
     return (atan(y/x)+3*pi/2); // subst 270 for 3*pi/2 if degrees 
    }else{ 
     return (atan(y/x)+pi/2); // subst 90 for pi/2 if degrees 
    } 
} 
0

Ceci est la mise en œuvre Pascal avec des nombres à virgule fixe si ArcTang est déjà mis en œuvre:

function Fix64ArcTan2(const y, x: fix64): fix64; 
// based on http://en.wikipedia.org/wiki/Atan2 
// Variation of the arctangent function. For any real arguments x and y not both 
// equal to zero, arctan2(x,y) is the angle in radians between the positive x-axis 
// of a plane and the point given by the coordinates (x,y) on it. 
var 
    result: fix64; 
begin 
    if x = 0.0 then 
    if y = 0.0 then 
     result := 0.0; // ArcTan2(0,0) is undefined, but I had to return something !!! 
    elsif y > 0.0 then 
     result := FIX_PIHALF; 
    else // y < 0.0 
     result := -FIX_PIHALF; 
    endif; 
    else 
    result := Fix64ArcTan(Fix64Div(y,x)); 
    if x < 0.0 then 
     if Y < 0.0 then 
     result := result - FIX_PI; 
     else // y >= 0.0 
     result := result + FIX_PI; 
     endif; 
    endif; 
    if result > FIX_PI then 
     result := result - FIX_PITWO; 
    endif; 
    endif; 
    return(result); 
end; 
0

Quelle carte utilisez-vous. Les gars GHI ont l'espace de noms GHI .... System qui définit MathEx avec toutes les fonctions mathématiques manquantes.

Désolé de ne pas fournir de liens, mais je suis au travail donc je n'ai pas accès à mon code .NET MF à la maison.

Espérons que ça aide.

Cordialement