2009-12-09 2 views
0

J'ai donc une fonction dans une application qui doit permettre à l'utilisateur de calculer une fonction trig (sin, cos, tan) en utilisant radians OR degrés, et aussi d'attendre une valeur retournée de fonctions trigonométriques inverses (asin, acos, atan) en radians ou en degrés. Y at-il un moyen de le faire sans construire dans un convertisseur directement dans la façon dont ils entrent quelque chose? ce que j'essaie d'éviter, c'est d'avoir à convertir: le péché (45) au péché (dtor (45)) merci!évaluer les fonctions trig en degrés par opposition aux radians

+0

Im reffering aux fonctions de trig de compilation intégrées principalement –

+0

Les fonctions Trig (en effet, tous 'math.h') sont fournis par la bibliothèque math * *, pas par le compilateur. –

+0

Pourquoi ne voulez-vous pas convertir en radians? –

Répondre

0

Il n'y a aucun moyen de changer le fonctionnement des fonctions.

Une "solution" serait de nouveau rendre l'interface, et faire les conversions:

// for example 
float sin(float pX) 
{ 
    return std::sinf(d2r(pX)); 
} 

Et utiliser cette interface à la place. Placez-le dans un espace de noms math::.

+0

bien, je vois comment je veux le faire maintenant, merci –

+0

Vous ne devriez vraiment pas utiliser les degrés comme la représentation interne des angles, voir http://en.wikipedia.org/wiki/Radian#Advantages_of_measuring_in_radians –

+0

oh je suis vraiment d'accord. Je déteste les degrés et préfère de loin les radians.plus il s'agit d'un élément d'interface utilisateur, 90% des utilisateurs ne sont pas familiers avec les radians, ils préfèrent les degrés, donc je prévois de l'accomoder –

2

Cela devrait vraiment être géré par les routines d'affichage/entrée dans votre application. Avoir un mode commutable pour utiliser les degrés ou radians, et vos routines d'E/S font soit la conversion ou non en fonction du mode. Je veux dire, 90 degrés est pi/2 radians, juste affiché en utilisant une convention stupide - puisqu'ils représentent la même quantité, il ne devrait y avoir aucune différence dans la façon dont ils sont traités par calcul, juste une bizarrerie de représentation semblable à la localisation . Votre code de calcul actuel ne doit alors supporter qu'un seul mode (qui devrait être radians).

+0

le seul problème est qu'avec de grandes équations il commence à raccrocher un peu et je suis essayer de l'éviter –

+2

Que la conversion se produise dans vos routines d'E/S ou dans le moteur de calcul, il n'y a qu'une seule multiplication de toute façon. Si cela a un impact appréciable sur les performances, quelque chose d'autre ne va pas. –

0

Vous n'êtes pas certain qu'il existe un moyen réel de contourner ce problème si vous pouvez accepter les degrés et les radians. Il n'y a aucun moyen de dire juste à partir de l'entrée quelles unités vous utilisez. Par exemple, sin (2) a une valeur valide pour 2 degrés et 2 radians.

Vous devez effectuer la conversion appropriée avant d'entrer dans les fonctions. (Ou, vous devez convertir la sortie des fonctions trig inverses si elles veulent des degrés.)

0

Je suggère d'utiliser une modification de la solution de GMan et de créer une classe contenant des fonctions membres qui sont des wrappers de fonction trig et qui fonctionnent dans degrés de radians en fonction d'une variable mode. De cette façon, vous pouvez créer deux objets cTrig avec différents modes, ou un objet et changer de mode si nécessaire. Je vais pour l'ex-:

cTrig degrees(cTrig::DEGREES) ; 
cTrig radians(cTrig::RADIANS) ; 

double a = degrees.sin(90) ; 
double b = ragians.sin(M_PI) ; 

Je ajoute aussi DEG_TO_RAD et RAD_TO_DEG comme fonctions membres de cTrig.

Vous pouvez également créer des types cRadian et cDegree et surcharger les fonctions pour ces types.

Questions connexes