Voir la version complète : Tracer des traits
Bonsoir tout le monde :)
Voila, j'aimerai savoir comment tracer des traits dans une fenetre SDL :P
Si vous savez comment on fait, merci de me le dire :)
On prend ses petites mains et on code sa routine void drawLine(SDL_Surface* surf) !
Mais renseigne-toi il existe peut-être des petites bibliothèques de dessin software déjà prêtes.
Ah oui si tu n'as besoin que de droites parallèles aux axes du repère (je ne pense pas que ça soit le cas mais bon..), des SDL_Rect feront l'affaire.
Bah en faite, j'ai besoin de faire un cadre autour d'un surface avec un fond translucide, comme sur le rpg de MrCool
Si tu sais ce qu'est un coefficient directeur tu devrais être capable d'écrire une fonction de tracé de ligne en quelques minutes...
Qui plus est si tu veux juste tracer les bords d'un rectangle c'est encore plus simple !
Comme je ne voulais pas inclure du dessin direct dans mes tutoriaux, j'ai choisi d'afficher des bordures pré-dessinées.
De plus, comme SDL ne redimensionne pas automatiquement les surfaces, j'ai choisi de charge des surfaces à la bonne taille, quit à multiplier les images de gui alors que ça n'a pas réellement d'intérêt.
Par celà, je fais le choix de la simplicité "parce que c'est un tutorial" (ça va plus vite, il y a moins d'explication) et parce qu'après tout, ça marche :p
Sinon, il existe en effet pas mal de surcouche à SDL qui font tout ça. :)
Flamaros
08/08/2005, 00h55
Pour tracer des droites effectivment tu peux tres vite faire une fonction.
Il doit y avoir plusieurs algos possibles :
- a partir d'un cercle avec le triangle rectangle inscriptible dedans (la droite est l'hypotenuse)
- un autre truc qui est plus simple dont je ne me souviens plus du nom, d'ou le schema
http://profringo.free.fr/perso/droite.bmp
Tu incremantes les coordonnes de E de 1 (pixel) en 1 en x.
Le point D est le point que tu cherche a tracer.
Et pour ca tu sais que [CB] / [DE] = [BE] / [EA] (si je ne me trompe pas)
Donc tu peux trouver les coordonnees de D mais elles ne sont pas entieres, tu dois donc prendre le point en y qui est le plus proche de la valeur obtenue.
Tres pratiques pour faire des droites antialiasees.
L'avantage de cette methode est qu'elle n'utilise pas de trigo (cos, sin), elle est relativement rapide, et qu'elle n'a pas de cas particulier selon l'orientation.
Personellement ma méthode ca donnait quelquechose comme ca :
Calculer le coefficient directeur de [AC].
Ensuite, pour chaque avancée de point, calculer le nouveau coefficient directeur.
>coefficient directeur initial : tracer un point en y+1
<coefficient directeur initial : tracer un point en x+1
Après je ne sais pas si j'utilisais une méthode très optimale :)
Qui plus est, c'est juste l'idée générale, il faut gérer les cas ou le coefficient est nul, ou il est négatif, etc ...
Flamaros
08/08/2005, 01h13
J'aime bien faire des algo maison.
Le tiens me parait interessant il faudrait que je le teste histoire de voir ce que ca peux donner en perf et en qualite.
Au debut j'avais pas vraiment compris ton histoire de vecteur directeur.
Pour voir les perf c'est deliquat vaut mieux faire les tests sur une machine lente et tacer des droites en tres grands nombres. j'avais fait un prog pour ca. La 2eme methode que j'ai cite etait la plus rapide et en anti-aliasing avec une pas de 0.5 (4X) elle etait pas beaucoup plus lente que la 1ere.
EDIT : apparement une lib additionnelle permet de le faire, c'est la libsdl-gfx1.2
Que tu trouves sur le site de SDL
http://www.libsdl.org/libraries.php?order=name&category=any&completed=0&os=any&match_name=gfx&perpage=50
Ben de toute facon, j'ai du utiliser la SDL en tout et pour tout... 1 seule fois :) et c'était quand j'étais à rennes, sans internet, donc sans la documentation :/
Donc j'ai pas trop compris comment ca marchait, j'ai du recoder une fonction pour tracer une ligne. Ensuite à partir de cette fonction, j'en ait créé une autre pour remplir un triangle (en fait, à partir des 3 points, je tracais une ligne entre le 1er et le 2eme, puis pour chaque point que je tracais de la ligne du 2eme vers le 3eme, je retracais une ligne de ce point vers le 1er, a peine gourmand !). Et ensuite à partir de ca j'ai recodé une fonction pour remplir des polygones, autant dire que je me suis bien pris la tête pour pas grand chose :00000025:
Wouaaa, ça fait plaisir d'avoir autant de reponses :00000020:
Je vais voir ce que je peux faire avec tous ce que vous m'avez dit
Vais surtout jeter un coup d'oeil à SDL_gfx ;)
Flamaros
08/08/2005, 17h48
Lol c'est normal que tu prennes le plus simple c'est pour ca que je l'ai mis.
PS : google : SDL tarcer ligne (3 ou 4eme ressultat) si je me souviens bien
Bah j'ai regarder sdl_gfx, y'a une fonction toute faite pour tracer des ligne :)
Mais imposible de l'installer pour vc++ 8 :s
Enfin, je comprend pas trop comment l'installer
Je copie les includes dans le rep des includes du vc++, ya meme pas de fichier lib
Flamaros
09/08/2005, 02h19
Tu as des fichiers sources?
Certaine lib ne fournissent pas les dll et autre trucs.
Faut sans doute que tu la compile toi meme, soit pour en faire une dll soit directement avec ton code.
vBulletin® v.3.6.5, Copyright ©2000-2009, Jelsoft Enterprises Ltd. Tous droits réservés - Version française vbulletin-fr.org