Algorithme de lignes

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 062 fois - Téléchargée 34 fois

Contenu du snippet

voici un algorithme de lignes utilisant seulement la fonction putpixel() (permet d'allumer un pixel) d'Allegro. Donc il est facilement adaptable a une autre librairie graphique.

Je depose cette source en attendant vos critiques et ainsi je pourrais optimiser mon code...

Source / Exemple :


void MyLine(int xdep, int ydep, int xfin, int yfin)
{
   float a=0;
   int temp=0;
   int cste=0;
   
   unsigned int dy;
   unsigned int dx;
   
   dx=abs(xfin-xdep);
   dy=abs(yfin-ydep);
if(dx>=dy && dx!=0 && dy!=0)
{      
   if(xdep>xfin)
   {
      temp=xdep;
      xdep=xfin;
      xfin=temp;
   
      temp=ydep;
      ydep=yfin;
      yfin=temp;
   }
   a=((float)(yfin-ydep)/(xfin-xdep));
   
   for(int x=0;x<dx+1;x++)
   {
      putpixel(buffer,x+xdep,ydep+(x*a)+cste,makecol(255,255,255));
   }
}

if(dx<dy && dx!=0 && dy!=0)
{
   if(ydep>yfin)
   {
   temp=ydep;
   ydep=yfin;
   yfin=temp;
   
   temp=xdep;
   xdep=xfin;
   xfin=temp;
   }
   a=((float)(xfin-xdep)/(yfin-ydep));
   
   for(int y=0;y<dy+1;y++)
   {
      putpixel(buffer,xdep+(y*a)+cste,y+ydep,makecol(255,255,255));
   }
}

if(dx==0)
{
   if(ydep>yfin)
   {
      temp=ydep;
      ydep=yfin;
      yfin=temp;
   }
   for(int y=ydep;y<yfin+1;y++)
   putpixel(buffer,xdep,y,makecol(255,255,255));
}
if(dy==0)
{
      if(xdep>xfin)
   {
      temp=xdep;
      xdep=xfin;
      xfin=temp;
   }
   for(int x=xdep;x<xfin+1;x++)
   putpixel(buffer,x,ydep,makecol(255,255,255));
}
}

Conclusion :


Peut etre quand j'aurais le temps je commenterais mon code si ca peut vous aider...

A voir également

Ajouter un commentaire Commentaires
Messages postés
3
Date d'inscription
dimanche 18 décembre 2005
Statut
Membre
Dernière intervention
31 juillet 2006

Salut,

j'ai fait recemment le même type de code mais avec GDK...
Quelqu'un a t'il la même chose avec l'enti-crenelage ? donc avec des get & set/put...

Merci,
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
1
oui c'est vrai j'ai fais cette fonction pour un moteur 3D en fil de fer que j'avais fais avec allegro...mais j'ai vite arrété quand j'ai entendu parler d'acceleration matérielle...
Et je me suis rendu compte que faire un moteur 3D en software n'est pas genial...mais au moins j'ai appris quelques trucs a propos de la 3D.
Messages postés
20
Date d'inscription
vendredi 12 mars 2004
Statut
Membre
Dernière intervention
11 novembre 2005

Je relance un peu le sujet:
1- Algo pas du tout optimiser, je travail actuellement sur un moteur 3D utilisant la Xlib (linux) de bas niveau, j'utilise un do while pour le principale, quelques if pour la vérification comme:
si (y1 > y2) alors
y1--;
fin
Et oui, si on mets y1 plus grand que y2 il ne trouvera jamais le bout de la boucle...

Sinon, je suppose que cela pourrai servir pour une personne qui veut fqaire un moteur 3d avec allegro (et oui)
Cette lib est peut-etre 2d mais en faisant ces fonction, comme toi, on peut facilement faire un moteur 3d en mode fil de fer.
Messages postés
4
Date d'inscription
jeudi 9 décembre 2004
Statut
Membre
Dernière intervention
25 décembre 2004

pour qu' on comprenne vos trucs et que si vous voulz
mettez au moins quelques lignes de commentaire et salut Kirua
ahhhhhhhhhh
a++
Messages postés
4
Date d'inscription
jeudi 9 décembre 2004
Statut
Membre
Dernière intervention
25 décembre 2004

pour qu' on comprenne vos trucs et que si vous voulz
mettez au moins quelques lignes de commentaire et salut Kirua
ahhhhhhhhhh
a++
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.