/////////////////////////////////////////////// // // Outil de trace de courbe. // // Sylvain MARECHAL // /////////////////////////////////////////////// #include #include #include #include #include "courbe.h" // Taille de l'ecran static int s_xScreenMax, s_yScreenMax; // Fenetre min/max des valeurs de la courbe static double s_xGraphicsMin; static double s_yGraphicsMin; static double s_xGraphicsMax; static double s_yGraphicsMax; /////////////////////////////////////////////// // // Initialise le mode video // Necessite le repertoire ou sont stockes // les drivers BGI (pszBgiPath) // // Renvoie 0 si OK, -1 sinon // /////////////////////////////////////////////// int InitGraphics( char * pszBgiPath ) { int gdriver = DETECT, gmode, errorcode; // Recherche le meilleur mode possible initgraph(&gdriver, &gmode, pszBgiPath); // Verifie que ca marche errorcode = graphresult(); if (errorcode != grOk) { // Probleme ! return -1; } // Recupere la taille de l'ecran en pixels // Sauvegarde dans des globales s_xScreenMax = getmaxx(); s_yScreenMax = getmaxy(); return 0; } /////////////////////////////////////////////// // // Restore le mode texte // /////////////////////////////////////////////// void DestroyGraphics() { restorecrtmode(); closegraph(); } /////////////////////////////////////////////// // // Defini l'echelle de la courbe a tracer // de maniere qu'elle tienne a l'ecran // // Les coordonnees (xMin,xMax,yMin,yMax) // doivent etre choisies de maniere que les // points extremes de la courbe soient a // l'ecran // // Renvoie 0 si OK, -1 sinon // /////////////////////////////////////////////// int SetGraphicsScale( double xMin, double xMax, double yMin, double yMax ) { if( xMin >= xMax ) return -1; if( yMin >= yMax ) return -1; // Sauvegarde dans des globales s_xGraphicsMin = xMin; s_yGraphicsMin = yMin; s_xGraphicsMax = xMax; s_yGraphicsMax = yMax; return 0; } /////////////////////////////////////////////// // // Convertit une abscisse de la courbe en abscisse // ecran directement utilisable par les fonctions // line*() etc... // /////////////////////////////////////////////// int xGraphics2Screen( double xGraphic ) { int xScreen; xScreen = (int)(s_xScreenMax * (double)(xGraphic - s_xGraphicsMin) / (double)(s_xGraphicsMax - s_xGraphicsMin)); return xScreen; } /////////////////////////////////////////////// // // Convertit une ordonnee de la courbe en ordonnee // ecran directement utilisable par les fonctions // line*() etc... // /////////////////////////////////////////////// int yGraphics2Screen( double yGraphic ) { int yScreen; yScreen = (int)(s_yScreenMax - s_yScreenMax * (double)(yGraphic - s_yGraphicsMin) / (double)(s_yGraphicsMax - s_yGraphicsMin)); return yScreen; } /////////////////////////////////////////////// // // Dessine les axes X et Y, et affiche l'echelle // au pas demande ainsi que le titre des axes: // // int color : Couleur (Ex:BLUE) // double xPas : Pas de l'echelle selon X // double yPas : Pas de l'echelle selon Y // char * pszxTitle : Titre sous l'axe des X // char * pszyTitle : Titre sous l'axe des Y // /////////////////////////////////////////////// void DrawGraphicsAxys( int color, double xPas, double yPas, char * pszxTitle, char * pszyTitle ) { int xScreenCenter, yScreenCenter; double x,y; char sz[25]; // Couleur setcolor(color); // Dessine l'axe des X yScreenCenter = yGraphics2Screen(0); line( 0, yScreenCenter, s_xScreenMax, yScreenCenter ); // Dessine l'echelle des X au pas xPas for( x = s_xGraphicsMin; x < s_xGraphicsMax; x += xPas ) { double xArrondi; int xScreen; // On dessine xArrondi = x - fmod(x,xPas); if( xArrondi != 0 ) { xScreen = xGraphics2Screen(xArrondi); line( xScreen, yScreenCenter - 2, xScreen, yScreenCenter + 2 ); sprintf( sz, "%5.2f", xArrondi ); outtextxy(xScreen - 5, yScreenCenter + 6, sz ); } } // Dessine l'axe des Y xScreenCenter = xGraphics2Screen(0); line( xScreenCenter, 0, xScreenCenter, s_yScreenMax ); // Titre en X if( pszxTitle ) outtextxy(s_xScreenMax - s_xScreenMax/3, yScreenCenter + 20, pszxTitle ); // Dessine l'echelle des Y au pas yPas for( y = s_yGraphicsMin; y < s_yGraphicsMax; y += yPas ) { double yArrondi; int yScreen; // On dessine yArrondi = y - fmod(y,yPas); if( yArrondi != 0 ) { yScreen = yGraphics2Screen(yArrondi); line( xScreenCenter - 2, yScreen, xScreenCenter + 2, yScreen ); sprintf( sz, "%5.2f", yArrondi ); outtextxy(xScreenCenter + 6, yScreen, sz ); } } // Titre en Y if( pszyTitle ) outtextxy( xScreenCenter + 15, 10, pszyTitle ); }