Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Tracer une fonction  (Lu 4145 fois)

0 Membres et 1 Invité sur ce sujet

maju93160

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
Tracer une fonction
« le: Décembre 01, 2012, 10:39:32 pm »
   Bonjours à tous,

            J'essaie de tracer la fonction sin(x) mais à l'aide des séries entières. Mais je ne sais pas pourquoi je n'arrive pas à afficher les valeurs correctes  :'(
            J'aimerais donc si c'est pas trop demandé avoir un peu d'aide pour débloquer la situation  ;D
            Je voudrais juste une aide pour la série entière usuelle le reste je peux me débrouiller tout seul je pense  ;D 

Voici mon code :

 //Le main
#include <iostream>
#include <SFML/Graphics.hpp>
#include "Trace.hpp"
#include "Repere.hpp"
#include "constante.hpp"

using namespace sf;
using namespace std;

int main()
{

    RenderWindow window(VideoMode(1200,800), "play", Style::None);
    window.setFramerateLimit(60);
    bool unique(true);
    Trace trace(2);
    Repere repere("ressources/repere.png");

    int i(0);

     while(window.isOpen())
    {
        Event event;

        while(window.pollEvent(event))
       {

            if((event.type == Event::KeyReleased) && (event.key.code == sf::Keyboard::Escape))
            {
               window.close();
            }
            if(unique)
            {

            for(i = 0; i< 5 ; ++i)
                {
                    window.draw(trace.Place(i));
                }
            unique = false;
            }
       }

        window.display();
    }
    return EXIT_SUCCESS;


}
 
  //Class Trace
#include <iostream>
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <vector>
#include <cmath>
#include "Trace.hpp"
#include "constante.hpp"

using namespace sf;
using namespace std;

Trace::Trace(int n): m_n(n)
{

}

RectangleShape Trace::Place(int positionX)   //ICI le beug
{
        m_points = 0;
        for(int i(0); i < m_n ; ++i)
        {
          m_local = 2*i+1;
          m_variable =  pow(-1,i)*pow(positionX,m_local);
          m_valeurs = Factoriel(m_local);
          m_points = m_variable/m_valeurs + m_points;
          cout << m_variable << endl << m_valeurs << endl << m_points << endl;
          cout << "--------------" << positionX << endl;
        }
        m_ordonnee.setSize(sf::Vector2f(10, 10));
        m_ordonnee.setOutlineColor(sf::Color::White);
        m_ordonnee.setPosition(positionX+100,800-m_points);



    return m_ordonnee;
}

int Trace::Factoriel(int n)
{
    int m(1);

    for(int i(1); i <= n; ++i)
     {
         m = m*i ;
     }

    return m;
}

 
#ifndef TRACE_HPP_INCLUDED
#define TRACE_HPP_INCLUDED
#include <iostream>
#include <SFML/Graphics.hpp>
#include "constante.hpp"

class Trace
{
        public:
    Trace(int n);
    sf::RectangleShape Place(int positionX);
    int Factoriel(int n);
    int valeur();


        private:

    unsigned int m_local;
    long long   m_points;
    long long  m_valeurs;
    long long m_variable;
    sf::RectangleShape m_ordonnee;
    int m_n;

};

#endif // TRACE_HPP_INCLUDED
 

Merci d'avance  :-*

G.

  • Hero Member
  • *****
  • Messages: 1592
    • Voir le profil
Re : Tracer une fonction
« Réponse #1 le: Décembre 02, 2012, 02:26:52 am »
Ça n'a pas l'air faux. Par contre avec une précision de 2 tu vas avoir des résultats bien éloignés du vrai sinus. Essaie avec une précision de 10 par exemple.

Par contre, qu'est-ce que tout ça fait dans ta boucle d'évènements ?

maju93160

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
Re : Tracer une fonction
« Réponse #2 le: Décembre 02, 2012, 09:46:08 am »
ReBonjour,

Citer
Par contre, qu'est-ce que tout ça fait dans ta boucle d'évènements ?

Ma boucle évènement permet de connaitre combien de points on veut placer (la valeur de i).
J'ai essayé avec 10 mais bon je sais pas pourquoi je n'arrive pas à avoir la courbe de sinus  ??? mais plutôt quelque point au début puis plus rien  :(

Lorsque je passe à une précision supérieure à 15 mon programme plante (je ne sais pas si c'est mon pc ou autre).

Merci d'avance  :)

lezebulon

  • Full Member
  • ***
  • Messages: 235
    • Voir le profil
Re : Tracer une fonction
« Réponse #3 le: Décembre 02, 2012, 11:56:12 pm »
Hello
y'a plein d'erreurs dans ton code, déjà pourquoi tu calcules tout avec des entiers? vu que le sinus est entre -1 et 1 ça pourra jamais marcher.... pareil pour la position X tu files que des entiers donc forcemment vu que la période est de 6 et quelques, tu va rien voir.
J'ai fait une correc rapide qui marche à peu près, mais de toute façon très rapidement la série entière converge pas super bien...

//Le main

#include <iostream>
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <vector>
#include <cmath>


using namespace sf;
using namespace std;


class Trace
{
        public:
    Trace(int n);
    sf::RectangleShape Place(double positionX);
    int Factoriel(int n);
    int valeur();


        private:

    unsigned int m_local;
    double   m_points;
    long long  m_valeurs;
    double m_variable;
    sf::RectangleShape m_ordonnee;
    int m_n;

};

Trace::Trace(int n): m_n(n)
{

}

RectangleShape Trace::Place(double positionX)   //ICI le beug
{
        m_points = 0;
        for(int i(0); i < m_n ; ++i)
        {
          m_local = 2*i+1;
          m_variable =  pow((int)-1,(double)i)*pow((double)positionX,(double)m_local);
          m_valeurs = Factoriel(m_local);
          m_points = m_variable/m_valeurs + m_points;
        }
                cout <<  m_points << " vs " << sin(positionX) << '\n';


        m_ordonnee.setSize(sf::Vector2f(10, 10));
        m_ordonnee.setOutlineColor(sf::Color::White);
                //m_ordonnee.setFillColor(sf::Color::Red);
        m_ordonnee.setPosition(positionX*100+100, m_points*400 + 100);
                //m_ordonnee.setPosition(10,10);



    return m_ordonnee;
}


int Trace::Factoriel(int n)
{
    int m(1);

    for(int i(1); i <= n; ++i)
     {
         m = m*i ;
     }

    return m;
}
using namespace sf;
using namespace std;

int main()
{

        RenderWindow window(VideoMode(800,600), "play", Style::Titlebar);
    window.setFramerateLimit(10);
    bool unique(true);
    Trace trace(10);
   //Repere repere("ressources/repere.png");

    int i(0);

     while(window.isOpen())
    {
        Event event;

                window.clear();
                while(window.pollEvent(event))
                {

                        if((event.type == Event::KeyReleased) && (event.key.code == sf::Keyboard::Escape))
                        {
                                window.close();
                        }

                }

                for(i = 0; i< 100 ; ++i)
                {
                        window.draw(trace.Place(i/10.0));
                }

                window.display();
         }
    return EXIT_SUCCESS;


}
 

maju93160

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
Re : Tracer une fonction
« Réponse #4 le: Décembre 03, 2012, 08:17:57 pm »
  Re bonjour,

A oui merci j'avais oublié que ce détail sur la fonction sinus  :-[
Citer
y'a plein d'erreurs dans ton code

 pourrai-je  connaitre les erreurs pour que je puisse améliorer mon code et aussi améliorer mon niveau en maths et en programmation ?  8)

Merci beaucoup  :)

maju93160

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
Re : Tracer une fonction
« Réponse #5 le: Décembre 03, 2012, 08:41:46 pm »
Re bonjours,
J'ai essayer de modifier mais à partir d'une certaine valeur m_n la valeur de F(positionX) = nan.
de plus je ne sais pas pourquoi mais la fenêtre clignote alors que grâce à la valeur unique les points ne devrait pas clignoter  :'(
  Voici le code ( au niveau du main ) :
 
#include <iostream>
#include <SFML/Graphics.hpp>
#include "Trace.hpp"
#include "Repere.hpp"
#include "constante.hpp"

using namespace sf;
using namespace std;

int main()
{

    RenderWindow window(VideoMode(800,600), "play", Style::Titlebar);
    window.setFramerateLimit(10);
    bool unique(true);
    Trace trace(10);
    Repere repere("ressources/repere.png");

    int i(0);

     while(window.isOpen())
    {
        Event event;

        while(window.pollEvent(event))
       {
            if((event.type == Event::KeyReleased) && (event.key.code == sf::Keyboard::Escape))
            {
               window.close();
            }
            if ((event.type == Event::KeyReleased) && (event.key.code == sf::Keyboard::F1))
            {
                Image screen = window.capture();
                screen.saveToFile("screenshot.bmp");
            }
            if(unique)
            {
                window.clear(Color::White);
                for(i = 0; i< 100 ; ++i)
                {
                    window.draw(trace.Place(i/10));
                }
                unique = false;
            }
       }
        window.display();
    }
    return EXIT_SUCCESS;


}
 

  Merci

 

anything