IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Cosinus en c


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 1
    Par défaut Cosinus en c
    Bonjour,
    Je réalise un programme pour calculer la trajectoire d'une bille. Jusqu'ici le programme marche parfaitement, mais quand j'intègre les cosinus et les tangentes au calcul de l'ordonnée de la bille, la fenetre ce referme immédiatement et renvoie 3... Y a-t-il quelque chose de spécial a faire pour la trigo?

    Voici mes déclarations des variables de calcul et mon code d'affichage du point.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    int continuer = 1, continuerD = 1, sourisX, sourisY, tempsActuel = 0, tempsPrecedent = 0, tempsDepart = 0, X = 12, Y = 472;
     
    double distance, gravite = 9.81, vitesse = sqrt(3*9.81), angle = 0, angleRad = 0, Sin2Teta = 0, Teta2 = 0 ,Z = 472, A = 12;
     
                   if(event.button.x >= 745 && event.button.y >= 510 && event.button.x <= 793 && event.button.y <= 558)
                    {
                        tempsDepart = SDL_GetTicks();
                        while(tempsActuel - tempsDepart < 10000)
                        {
                            tempsActuel = SDL_GetTicks();
                            if (tempsActuel - tempsPrecedent > 100)
                            {
                                Sin2Teta=(distance*gravite)/(vitesse*vitesse);
                                Teta2=asin(Sin2Teta);
                                angleRad=Teta2/2;
                                angle = (180*angleRad)/M_PI;
                                X++;
                                Z =  Z - ( - gravite / (2 * pow(vitesse, 2) * pow(cos(angleRad), 2)) * X * X + tan(angleRad) * X);
                                Y = (int)Z;
     
                                positionBille.x = X;
                                positionBille.y = Y;
                                tempsPrecedent = tempsActuel;
                                SDL_BlitSurface(bille, NULL, ecran, &positionBille);
                                SDL_Flip(ecran);
                            }
                        }
                    }

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Salut
    Tu devrais rajouter du printf() pour être sûr que ça vient bien de ces fonctions. Et aussi pour vérifier si le dénominateur de ta division ne vaut pas 0. Et j'espère aussi que tu as inclus <math.h>...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Pour utiliser les fonctions cosinus, tangente et sinus, on nous conseille de ne pas utiliser ces fonctions.

    Mais plutôt de créer un tableau puis de lire dedans cosinus[x] pour cos(x), ce qui est d'après mes sources plus rapide.

    Sinon, return 3, c'est un SEGFAULT, tu touches un espace mémoire qui ne t'appartient pas.

    Dans le cas d'une division par 0, c'est un autre type d'erreur.

    Essaye surtout de regarder au niveau de tes pointeurs

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    Mais plutôt de créer un tableau puis de lire dedans cosinus[x] pour cos(x), ce qui est d'après mes sources plus rapide.
    , oui, sur Amiga ou les consoles portables qui n'ont pas de gestion de virgule flottante. Mais en général, maintenant, les PCs sont capable de répondre en un temps appréciable aux fonctions cos() / sin() (même s'il est vrai que le précalcul sera toujours plus rapide).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Mais plutôt de créer un tableau puis de lire dedans cosinus[x] pour cos(x), ce qui est d'après mes sources plus rapide.
    Pas évident car comment affuter ce tableau ? De 1 en 1 ? De 0.1 en 0.1 ?? De 0.01 en 0.01 ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    C'est à lui de le déterminer en fonction de son utilisation.

    Après comme cela je ne peux évidemment pas donner de chiffres.

    Vu que pour la gravité, il prend 9,81 je dirais qu'il devrait affuter de 0,001 en 0,001 (comme ça il est sûr d'avoir une précision qui lui convienne mais de 0,01 en 0,01 pourrait marcher aussi)

  7. #7
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Par défaut
    salut !
    le cosinus ne peut pas engendrer d'erreur ! par contre la tangente, l'arc sinus oui.

    A+

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    dans ce débat la question est surtout

    Citation Envoyé par Neckara Voir le message
    Pour utiliser les fonctions cosinus, tangente et sinus, on nous conseille de ne pas utiliser ces fonctions.
    Qui te conseille ça et pourquoi ?

    Dans 99.999999999% des cas aujourdhui cela n'a pas d'influence...

    Franchement j'aimerais bien connaître les raisons et le contexte d'un tel conseil !!!

  9. #9
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Par défaut urban legend
    on nous conseille de ne pas utiliser ces fonctions.
    les légendes ont la vie dure ...

    A+

  10. #10
    Membre éprouvé
    Homme Profil pro
    Retraité MO
    Inscrit en
    Mai 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Retraité MO
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2008
    Messages : 75
    Par défaut
    J'avais fait un truc comme ça en Basic il y a plus de 20 ans, car je n'avais pas les fonctions trigo dans ma machine.
    J'ai retrouvé un vieux texte dans mes archives. Mais je ne sais plus si c'était un brouillon ou un truc en état de marche. D'ailleurs, j'ai deux définitions du COS, et il me semble me rappeler que l'ATN fonctionnait une fois sur deux.

    Donc c'est à revérifier et réécrire.


    Pi.......................................3.1415926535897932384626433
    COS(radians)........................SIN(radians + (Pi / 2) )
    TAN(radians)........................SIN(radians) / COS(radians)
    COT(radians)........................1 / TAN(radians)


    ____



    function FACTOR(INIFACT) // Factorielle(nombre)

    RESUFACT := INIFACT
    for BASFACT = (INIFACT-1) to 1 step -1
    RESUFACT *= BASFACT
    next

    return RESUFACT

    function SIN(INISINUS) // Sinus(radians)

    IN2SINUS := INISINUS % (2 * Pi)
    RESUSINUS := IN2SINUS
    RESUSINUS -= ( IN2SINUS **3 ) / FACTOR(3 )
    RESUSINUS += ( IN2SINUS **5 ) / FACTOR(5 )
    RESUSINUS -= ( IN2SINUS **7 ) / FACTOR(7 )
    RESUSINUS += ( IN2SINUS **9 ) / FACTOR(9 )
    RESUSINUS -= ( IN2SINUS **11) / FACTOR(11)
    RESUSINUS += ( IN2SINUS **13) / FACTOR(13)
    RESUSINUS -= ( IN2SINUS **15) / FACTOR(15)
    RESUSINUS += ( IN2SINUS **17) / FACTOR(17)
    RESUSINUS -= ( IN2SINUS **19) / FACTOR(19)

    return RESUSINUS

    function COS(INICOSIN)

    IN2SINUS := INICOSIN % (2 * Pi)
    RESUSINUS := 1
    RESUSINUS -= ( IN2SINUS **2 ) / FACTOR(2 )
    RESUSINUS += ( IN2SINUS **4 ) / FACTOR(4 )
    RESUSINUS -= ( IN2SINUS **6 ) / FACTOR(6 )
    RESUSINUS += ( IN2SINUS **8 ) / FACTOR(8 )
    RESUSINUS -= ( IN2SINUS **10) / FACTOR(10)
    RESUSINUS += ( IN2SINUS **12) / FACTOR(12)
    RESUSINUS -= ( IN2SINUS **14) / FACTOR(14)
    RESUSINUS += ( IN2SINUS **16) / FACTOR(16)
    RESUSINUS -= ( IN2SINUS **18) / FACTOR(18)

    return RESUSINUS

    function ATN(INIARCTN) // ArcTAN(tang) => rad

    if INIARCTN < 10 .and. INIARCTN > -10
    RESUARCTN := Pi * 1.5
    TPNARCTN := RESUARCTN / 20
    do while abs(TAN(RESUARCTN) - INIARCTN) > 0.00001
    do while TAN(RESUARCTN) > INIARCTN
    RESUARCTN -= TPNARCTN
    enddo
    do while TAN(RESUARCTN) < INIARCTN
    RESUARCTN += TPNARCTN
    enddo
    TPNARCTN *= 0.1
    enddo
    elseif INIARCTN < -10000
    RESUARCTN := (2 * Pi * 90.02 / 360)
    elseif INIARCTN < -1000
    RESUARCTN := (2 * Pi * 90.3 / 360)
    elseif INIARCTN < -100
    RESUARCTN := (2 * Pi * 92 / 360)
    elseif INIARCTN < 100
    RESUARCTN := (2 * Pi * 88 / 360)
    elseif INIARCTN < 1000
    RESUARCTN := (2 * Pi * 89.7 / 360)
    else
    RESUARCTN := (2 * Pi * 89.98 / 360)
    endif
    // if RESUARCTN > Pi ; RESUARCTN -= Pi ; endif

    return (RESUARCTN - Pi)


    PS : et en plus je n'ai jamais été un as en maths !

Discussions similaires

  1. tracer un joli cosinus
    Par max2x dans le forum Delphi
    Réponses: 8
    Dernier message: 21/03/2007, 19h28
  2. sinus -1 cosinus -1 [Math]
    Par Extra-Nitro dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 10/01/2007, 14h14
  3. Formule linéaire de calcul de cosinus
    Par méphistopheles dans le forum Algorithmes et structures de données
    Réponses: 16
    Dernier message: 21/12/2005, 18h47
  4. Arc cosinus
    Par SuperCed dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 17/02/2005, 17h58
  5. cosinus complexe
    Par Mat 74 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 26/01/2005, 10h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo