IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

L'algorithme de bresenham


Sujet :

Algorithmes et structures de données

  1. #1
    Membre habitué Avatar de ccensam
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Points : 162
    Points
    162
    Par défaut L'algorithme de bresenham
    Salut tous les developpeurs,

    Je vais vous representer un petit problémes sur :

    L'algorithme de bresenham (pour une ligne) permet de donnez les coordonnées succissives pour représenter un ligne su l'écran, Cet algoritme est concus pour le 1er et 5émé octant, mais on peut le généralisé pour les autres octants, J'ai arrivé le généraliser pour le 2émé et le 6éme Octants.
    Mais j'arrive pas à le faire pour 3,4,7 et 8éme octant.

    Voila la fonction C, pour cet algorithme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    void bresLINE(point &a,point &b)
    {
    	int p;
    	point tmp;
    	if(a.x>b.x)
    	{
    		tmp = b;
    		b = a;
    		a = tmp;
    	}
     
    	int deltax = b.x - a.x;
    	int deltay = b.y - a.y;	
    	tmp.x = a.x;
    	tmp.y = a.y;
    	if (a.y<=b.y)        
    	{
    		if (deltax>= deltay)    // pour le 1er et 5émé octant
    		{
    			p = (2*deltay) - deltax;
    			for (int i=0; i<=deltax ; i++)
    			{
    				cout<<"("<<tmp.x<<" , "<<tmp.y<<" )\n";
    				tmp.x +=1;
    				if (p<0)
    				{
    					p += (2*deltay);
    				}
    				else
    				{
    					p += 2*(deltay - deltax);
    					tmp.y += 1;
    				}
    			}
    		}
     
    //////////////////////////////////////////////////////////////////
     
    		else  // pour le 2émé et 6émé octant
    		{
    			p = (2*deltax) - deltay;
    			for (int i=0; i<=deltay ; i++)
    			{
    				cout<<"("<<tmp.x<<" , "<<tmp.y<<" )\n";
    				tmp.y +=1;
    				if (p<0)
    				{
    					p += (2*deltax);
    				}
    				else
    				{
    					p += 2*(deltax - deltay);
    					tmp.x += 1;
    				}
    			}
    		}
    	}
    }
    Quel qu'un peut m'aider!!!
    Merci
    - Microsoft Dynamics AX Technical Expert
    - OpenERP Module Developper
    - Mécanicien informaticien passioné
    - CV : http://www.viadeo.com/fr/profile/mohamed-amine.

  2. #2
    Membre confirmé
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Points : 451
    Points
    451
    Par défaut
    Salut,

    Voici une version plus courte et qui fontionne sur tous les octants...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    int sign(int a)
     {
     return (a  < 0 ? -1:1);
     }
     
    int abs(int a)
     {
     return (a  < 0 ? -a:a);
     }
     
    void bresLINE(point &a,point &b)
     {
      int dx,dy,x,y,s1,s2,e,temp,swap,i;
      dy=abs(b.y-a.y);
      dx=abs(b.x-a.x);
      s1=sign(b.x-a.x);
      s2=sign(b.y-a.y);
      x=a.x;
      y=a.y;
      if (dy>dx)
       {
        temp=dx;
        dx=dy;
        dy=temp;
        swap=1;
       }
       else swap=0;
      e=2*dy-dx;
      for(i=1;i<=dx;i++)
       {
        putpixel(x,y,WHITE); // ou cout...
        while (e>=0)
         {
          if (swap==1) x+=s1;
           else y+=s2;
          e-=2*dx;
         }
        if (swap==1) y+=s2;
         else x+=s1;
        e+=2*dy;
       }
     }
    "Cultiver les sciences et ne pas aimer les hommes, c'est allumer un flambeau et fermer les yeux." Proverbe chinois

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Swing] Implementation de l'algorithme de Bresenham
    Par selmagsi dans le forum Débuter
    Réponses: 2
    Dernier message: 18/04/2015, 16h39
  2. Algorithme de Bresenham
    Par ToTo13 dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 19/01/2011, 15h33
  3. algorithme de bresenham pour la détection de droite
    Par soumayacheikh dans le forum Images
    Réponses: 6
    Dernier message: 23/04/2010, 15h21
  4. [2D] Algorithme de Bresenham
    Par Trillian dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 09/03/2006, 14h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo