Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Sinus/Cosinus] Ma fonction rotation très lourde...

Coordonnées polaires

    23 octobre 2008 à 19:37:34

    Bonjour :D

    Je viens d'apprendre les coordonnées polaires mardi dernier :D
    Je viens de coder une fonction pour calculer les coordonnées à partir de 2 points : l'axe et le point d'origine, ainsi qu'avec 1 angle en radians.

    Ma fonction fonctionne tout à fait, mais il me reste un soucis: elle est extrêmement lourde... :pirate:

    Je voudrais savoir si c'est normal :-°
    Je vous donnerai mon code si cas contraire ;)

    Une screen de l'adaptation de ma fonction sur la SDL:

    Image utilisateur

    Pour dessiner mon cercle (360 points en tout), il me met entre 10 et 40 ms.
    Si j'en met 3600, il va entre 30 et 60 ms et etc...
    • Partager sur Facebook
    • Partager sur Twitter
      23 octobre 2008 à 21:44:10

      Salut,

      Déjà, si ce n'est pas fait, essaye de compiler en release, tu auras sûrement un gain de performance.

      Et, j'aimerais quand même bien voir ta fonction, car là on voit pas trop quel algo tu as utilisé.

      Sinon, au pire, tu peux faire une variable globale des valeurs des cosinus et des sinus de tes angles. Comme ça, pas de perte de temps à les calculer 360 fois pour un cercle.

      EDIT: Pour ta question, répondre serait relatif car cela dépend de ta machine. Mais, les cosinus et les sinus, sur les processeurs non équipés des instructions des cosinus et des sinus du jeu x87, sont assez lents à calculer. Si tu as un processeur 64 bits, tu as forcément ces instructions.

      A+
      • Partager sur Facebook
      • Partager sur Twitter
        23 octobre 2008 à 23:31:01

        SDL ?
        si tu fais des SDL_BlitSurface de 1 seul pixel ça s'explique : c'est a éviter a tout prix !
        • Partager sur Facebook
        • Partager sur Twitter

        Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

          24 octobre 2008 à 16:12:24

          Citation : royalbru

          Sinon, au pire, tu peux faire une variable globale des valeurs des cosinus et des sinus de tes angles. Comme ça, pas de perte de temps à les calculer 360 fois pour un cercle.



          On me l'a aussi conseillé ;)

          Citation : Fvirtman

          SDL ?
          si tu fais des SDL_BlitSurface de 1 seul pixel ça s'explique : c'est a éviter a tout prix !



          :lol: J'ai plus rapide que SDL_BlitSurface ;)
          Cf la fonction setPixel de m@téo21 dans son TP sur la visualisation spectrale :D

          Pour mon code, il est moche pour l'instant, donc je ne vous met que les 2 fonctions importantes ;)

          #define BLL_PI 3.141592654
          
          typedef struct _BLL_Point {
          	
          	int32 x;
          	int32 y;
          
          } BLL_Point;
          
          BLL_Point BLL_rotatePointFromAngleR(BLL_Point axe, BLL_Point p1, double angle)
          {
          	double d = 0;
          	double angle1, angle2;
          	BLL_Point point;
          	
          	point.x = p1.x - axe.x;
          	point.y = p1.y - axe.y;
          	
          	d = sqrt(pow(point.x, 2) + pow(point.y , 2));
          
          	angle1 = acos((((double) point.x) / d));
          	angle2 = angle1 + angle;
          	
          	return (BLL_Point) {cos(angle2) * d + axe.x, sin(angle2) * d + axe.y};
          }
          
          ...
          
          void drawCircle(SDL_Surface *screen, int diametre)
          {
          	BLL_Point p;
          	int x, y;
          	double angle1 = 0, angle2 = 0;
          	
          	BLL_setPixel(screen, 400, 300, SDL_MapRGB(screen->format, 255, 255, 255));
          	
          	while(angle1 < 360.) {
          		
          		angle1 += 1;
          		angle2 = BLL_ConvertDegreeInRadian(angle1);
          		
          		p = BLL_rotatePointFromAngleR(BLL_makePoint(400, 300), 
          									  BLL_makePoint(400 + diametre, 300),
          									  angle2);
          									  
          		x = (int) p.x;
          		y = (int) p.y;
          		
          		BLL_setPixel(screen, x, y, SDL_MapRGB(screen->format, 255, 255, 255));
          	}
          }
          


          J'ai mis BLL_PI car je ne veux pas inclure de librairies en dehors de stdlib et quelques autres dans mes headers (de ma lib principale) :p Sinon j'aurais inclue math.h et utilisé M_PI :lol:
          • Partager sur Facebook
          • Partager sur Twitter

          [Sinus/Cosinus] Ma fonction rotation très lourde...

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown