PDA

Voir la version complète : Tracer des traits


bougie
07/08/2005, 20h36
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 :)

Acetate
07/08/2005, 21h21
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.

bougie
07/08/2005, 21h53
Bah en faite, j'ai besoin de faire un cadre autour d'un surface avec un fond translucide, comme sur le rpg de MrCool

NewbiZ
07/08/2005, 22h00
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 !

MrCool
07/08/2005, 22h41
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.

NewbiZ
08/08/2005, 01h02
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

NewbiZ
08/08/2005, 01h48
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:

bougie
08/08/2005, 11h11
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

bougie
08/08/2005, 23h02
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.