Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] Faire des ronds, des triangles ...

en gors ;des figures une peu plus complexes

    1 janvier 2006 à 17:21:41

    Salut
    J'utilise SDL pour faire mes applications 2D et j'aimerais savoir comment on fait certaines formes geometriques comme un cercle , un triangle,..

    Je sais que pour faire un rectangle il faut utiliser : SDL_FillRect
    Et j'aimerais savoir s'il existe des fonctions similaires pour faire d'autres formes géometriques.


    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      1 janvier 2006 à 17:29:45

      Avec SDL tu es limité au rectangle, si tu veux faire des figures complexes, deux solutions :
      - tu codes les algos toi meme
      - tu passes à OpenGL :D
      • Partager sur Facebook
      • Partager sur Twitter
        1 janvier 2006 à 18:11:00

        Bon bah tant pis.
        Merci

        Et sinon tu sais pas comment on "dessine" juste un pixel sur l'ecran, on fait ca avec quel fonction(si c'est possible)?
        • Partager sur Facebook
        • Partager sur Twitter
          1 janvier 2006 à 18:28:52

          Si, tu dessines un rectangle de largeur et de hauteur 1 :)
          • Partager sur Facebook
          • Partager sur Twitter
            1 janvier 2006 à 19:09:25

            void putpixel(int x, int y, int color)
            {
              unsigned int *ptr = (unsigned int*)screen->pixels;
              int lineoffset = y * (screen->pitch / 4);
              ptr[lineoffset + x] = color;
            }


              putpixel(10, 10, 0xff0000);
              putpixel(11, 10, 0xff0000);
              putpixel(10, 11, 0xff0000);
              putpixel(11, 11, 0xff0000);
            • Partager sur Facebook
            • Partager sur Twitter
              1 janvier 2006 à 19:16:12

              Citation : minirop

              tu utilises des images



              Je trouve ca un peu inutile de faire un bmp assez lourd pour faire un rond; et si je veux faire plusieurs couleurs je dois faire plusieurs fichiers: c'est un peu lourd non?

              Merci Djeepy46234 je vais essayer de comprendre comment ca marche.

              Avec ca je vais essayer de faire mes propres fonctions... :lol:
              • Partager sur Facebook
              • Partager sur Twitter
                1 janvier 2006 à 19:30:24

                Pour les ronds, bah tu fais soit un algorithme qui fait un rond en pixel (faut être bien en math ou bien copier :D) ou bah sinon, tu y vas avec des sprites ^^ !

                Genre :

                const unsigned char sprite[] =
                {
                0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,
                0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,
                0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
                0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
                0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
                0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
                0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
                0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
                0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
                0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,
                0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0
                };
                • Partager sur Facebook
                • Partager sur Twitter
                  1 janvier 2006 à 20:27:22

                  Merci pour les sprite je connaisais pas cet technique.

                  Pour le cercle je pense je vais arriver une petite fonction, par contre pour les figures comme le triangle , ou un polygones c'est plus chaud.

                  Pour le cerlce suffit de calculer pour chaque pixel de la surface sa distance par rapport au centre du cercle (pour les nom matheux Racine((x'-x)²+(y'-y)²)) et de faire en fonction du rayon du cercle que l'on veut.
                  Mais pour des figures autres je vois pas...


                  J'en profite pour poser une derniere question: j'ai trouve un programme en c++ avec SDL et il utilise une fonction que je connais pas: SDL_LockSurface(surface);

                  J'aimerais savoir a quoi sert cet fonction?
                  Et il existe pas une doc SDL comme la doc php, ce serait pas mal, ca eviterai que je pose des questions sur toutes les fonctions que je rencontre en SDL :-°

                  EDIT:Pour ceux que ca interressent:
                  //pour dessiner un rond
                  void CercleFill(SDL_Surface* source,int x,int y,int rayon)
                  {
                  int i,j,w=0,h=0;
                  w=source->w;
                  h=source->h;
                        for (i=0;i<w;i++)     
                            for (j=0;j<h;j++)
                                if (sqrt(pow(i-x,2)+pow(j-y,2))<=rayon)       
                                    PutPixel(source,i,j,0x000000);
                  }


                  Il faut bien sur inclure math.h. Par contre elle est pas du tout optimiser parce quelle calcule pour chaque pixel de l'image.
                  Chez moi avec une image de 100*100, si je lui demande de faire un cercle ,chaque frame est assez longue a calculer(on voit la difference).

                  EDIT2:J'ai compris ce qu il allait pas : les fonctions mathematiques sont assez lentes,il ne vaut mieux pas trop les utiliser.
                  Le code une peu optimisé:
                  void CercleFill(SDL_Surface* source,int x,int y,int rayon,int R,int V,int B)
                  {
                  int i,j,w=0,h=0;
                  w=source->w;
                  h=source->h;
                        for (i=0;i<w;i++)     
                            for (j=0;j<h;j++)
                  //if (pow(i-x,2)+pow(j-y,2)<=pow(rayon,2)) //trop long
                               if ((i-x)*(i-x)+(j-y)*(j-y)<=rayon*rayon)                 
                                       PutPixel(source,i,j,Color(R,V,B,0));     
                  }
                  • Partager sur Facebook
                  • Partager sur Twitter
                    1 janvier 2006 à 21:15:46

                    Citation : 42

                    J'en profite pour poser une derniere question: j'ai trouve un programme en c++ avec SDL et il utilise une fonction que je connais pas: SDL_LockSurface(surface);

                    J'aimerais savoir a quoi sert cet fonction?


                    SDL_LockSurface permet de "vérouiller" une surface: entre l'appel à cette fonction et celui de SDL_UnlockSurface, tu peux accéder directement à ta surface et y dessiner ce que tu veux. Si tu ne fais pas cet appel, ça a des chances de planter. Ca permet de faire une fonction de dessin plus propre.

                    Citation : 42

                    Et il existe pas une doc SDL comme la doc php, ce serait pas mal, ca eviterai que je pose des questions sur toutes les fonctions que je rencontre en SDL


                    Sur le site, tu as la documentation officielle. Par contre, elle est en anglais, seule l'introduction a été traduite en français.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      1 janvier 2006 à 21:57:45

                      Tu peux aussi utiliser les fonctions trigo, genre :
                      a <- 0.0
                      pas <- 1.0
                      point(cos(a), sin(a))
                      SI ( (a+=pas) > 360 )
                      a = 0
                      FIN SI

                      Et en réglant ton pas, tu peux avoir un cercle plus ou moins lisse.
                      Dans le pseudo code ci-dessus, a est en degrés, la fonction cos() de la lib math ne prend que des radians je crois, il faudrait donc faire : cos(a*PI/180) pareil pour sin().
                      (Il faut aussi penser à relier 2 points successif, j'en suis pas sûr mais logiquement il doit y avoir une fonction SDL qui fait ça)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        2 janvier 2006 à 15:36:54

                        Citation : HunLyxxod

                        SDL_LockSurface permet de "vérouiller" une surface: entre l'appel à cette fonction et celui de SDL_UnlockSurface, tu peux accéder directement à ta surface et y dessiner ce que tu veux. Si tu ne fais pas cet appel, ça a des chances de planter. Ca permet de faire une fonction de dessin plus propre.



                        Ok merci.
                        Moi ca marchais quand meme, jarrivais a lire la couleur d'un pixel et de rajouter des pixel sur une surface sans utiliser cet fonction.
                        Mais bon on va tester.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 janvier 2006 à 22:46:38

                          Au passage, faire du pixel par pixel, c'est extrêmement lent donc je déconseil ;)
                          • Partager sur Facebook
                          • Partager sur Twitter

                          [SDL] Faire des ronds, des triangles ...

                          × 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