Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] dessiner une diagonale

comment faire?

Sujet résolu
Anonyme
    23 août 2006 à 16:20:02

    Bonjour,

    Je cherche à créer une diagonale ni horizontale ni vérticale. ça fais déjà plusieurs jours que je cherche sans trouver la bonne fonction.

    La fonction que je cherche à construire doit pourvoir dessiner pixel par pixel une droite dont la pente peut varrier. (pente = axe vertical sur axe horizontal (cf. cours de géométrie de l'école :p ))

    la droite en question part tout le temps de la même intersection (coordonnée (x1;y1)) pour arriver à une distance fixe (comme le rayon d'un cercle (ne varie pas)).

    voici un exemple de à quoi pourrais servir cette fonction :

    dessiner tout les 6°(par exemple) le rayon d'un cercle, un peu comme une roue de vélo.

    Ici, je doute qu'une image ne puisse fonctionner (il en faudrait trop) à moins qu'un fonction de rotation centrale soit envisagable...

    Si une librérie compatible SDL peut faire ce travail, merci de me l'indiquer (j'utilise CODEBLOCKS) et je code en C (pas C++)

    Merci d'avance.

    PS: si mes explication sont trop floues, merci de me le signaler.
    • Partager sur Facebook
    • Partager sur Twitter
      23 août 2006 à 16:38:27

      J'ai ça :
      // Fonction qui dessine un pixel
      void dot(SDL_Surface * surf,int x,int y,Uint32 color)
      {
          SDL_Rect rect;
          rect.x=x;
          rect.y=y;
          rect.w=1;
          rect.h=1;

          SDL_FillRect(surf,&rect,color);
      }

      // Fonction pour tracer une ligne droite
      void DrawLine(SDL_Surface * surf,int x1,int y1,int x2,int y2,Uint32 color)
      {
          int div,i;

          // Pos contient la position actuelle sur la ligne
          // Move contient le vecteur qui est ajouté à pos pour passer au pixel suivant
          f_vecteur2D pos,move;

          // Position de départ
          pos.x=x1;
          pos.y=y1;

          // Déplacement maxi
          move.x=x2-x1;
          move.y=y2-y1;

          // On divise ce déplacement par la plus grande différence de coordonnées
          div = abs_max(x2-x1,y2-y1);
          move.x=move.x/div;
          move.y=move.y/div;

          // Maintenant, on boucle DIV fois
          for(i=0;i<div;i+=1)
          {
              // Point
              dot(surf,(int)pos.x,(int)pos.y,color);

              // On avance
              pos.x+=move.x;
              pos.y+=move.y;
          }
      }

      Tu peux changer pour faire ton truc en utilisant la trigonométrie pour calculer les coordonnées d'arrivée.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        23 août 2006 à 17:59:18

        Merci pour toutes tes indications!

        Mais (désolé mais il y en a toujours un :p , mais rien de grave quand même) je aurais plus tendance à utiliser cette fonction pour "void dot(SDL_Surface * surf,int x,int y,Uint32 color)"

        J'ai la fonction de M@téo21 dans mon projet :

        //fonction de modification pixel par pixel
        void setPixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
        {
            int bpp = surface->format->BytesPerPixel;

            Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;

            switch(bpp) {
            case 1:
                *p = pixel;
                break;

            case 2:
                *(Uint16 *)p = pixel;
                break;

            case 3:
                if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
                    p[0] = (pixel >> 16) & 0xff;
                    p[1] = (pixel >> 8) & 0xff;
                    p[2] = pixel & 0xff;
                } else {
                    p[0] = pixel & 0xff;
                    p[1] = (pixel >> 8) & 0xff;
                    p[2] = (pixel >> 16) & 0xff;
                }
                break;

            case 4:
                *(Uint32 *)p = pixel;
                break;
            }
        }


        Ensuite il y a cette ligne dans ta deuxième fonction qui va, je le sens d'avance, me posser des problèmes :

        f_vecteur2D pos,move;


        C'est une structure apperment, et à moins qu'elle se trouve dans l'un des header de la SDL, je ne l'ai pas. Donc mon programme va planter...

        Est-ce que si je met :

        SDL_Rect pos, move;


        ça engendrera des erreurs inatendues?

        Et la fonction "abs_max" sort de quel include ?


        Ecnore un tout petit détail, c'est plus perso qu'autre chose, mais j'aurais mis :

        for(i=0;i<div;i++)


        au lieu de :

        for(i=0;i<div;i+=1)


        mais bon, ce n'est qu'un détail. ;)

        En tout cas merci pour cette fonction!

        Et je te remercie d'avance de m'indiquer si oui ou non cette structure est bien dans les header de bases de la SDL.

        A bientôt.
        • Partager sur Facebook
        • Partager sur Twitter
          24 août 2006 à 13:39:54

          Ah, ça sort d'un vieux code, désolé j'ai vraiment pas assez réfléchi.
          typedef struct {
              float x, y;
          } f_vecteur;
          #define abs_max(x, y) ((abs(x)>abs(y))?abs(x):abs(y))

          J'avais pas fait attention ^^

          La fonction dot() peut évidement être améliorée, mais si tu utilises celle de M@teo21, n'oublie pas de locker et unlocker la surface.
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            24 août 2006 à 15:35:02

            Merci beaucoup!!

            Maintenant mon programme marche!! :D

            Mais encore une question (juste pour savoir), que fais la fonction "abs"?
            • Partager sur Facebook
            • Partager sur Twitter
              25 août 2006 à 11:51:00

              (abs(x)>abs(y))?abs(x):abs(y)

              =

              if(abs(x)>abs(y))
                 abs(x);
              else
                 abs(y);


              (pas sur, mais a 75% :p )
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                25 août 2006 à 12:32:26

                la fonction abs(x) renvoies la valeur absolue de x non ?
                • Partager sur Facebook
                • Partager sur Twitter
                  25 août 2006 à 12:42:17

                  remram aime bien ces conditions farfelues :x
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    25 août 2006 à 15:54:10

                    Merci pour le coup de main.

                    Je connaissait seulement la fonction fabs pour récupérer l'absolut.

                    Citation : A06



                    (abs(x)>abs(y))?abs(x):abs(y)


                    =


                    if(abs(x)>abs(y))
                       abs(x);
                    else
                       abs(y);



                    (pas sur, mais a 75% :p )



                    Moi j'en suis sur ;)

                    Encore merci et à bientôt.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 août 2006 à 16:37:59

                      Ah ouais c'est fabs() en C...
                      #define abs(x) ((x)>=0)?(x):-(x)) 

                      Quand à l'opérateur ternaire ?: je l'aime bien et il est assez pratique. Par exemple ici, car on ne peux pas le faire autrement avec un define...
                      • Partager sur Facebook
                      • Partager sur Twitter

                      [SDL] dessiner une diagonale

                      × 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