Triangle plein en c

Signaler
Messages postés
69
Date d'inscription
lundi 10 février 2003
Statut
Membre
Dernière intervention
29 août 2012
-
Messages postés
280
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
8 juillet 2014
-
bonjour,

je programme en c et je cherche un algorithme optimisé pour faire un triangle rempli d'une couleur
je n'ai pas le droit d'utiliser opengl ou autre
si possible je cherche la meme chose pour faire un triangle effectuant un degrade entre ses trois sommet
sommet 1 rouge sommet 2 bleu et sommet 3 vert

merci

6 réponses

Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Bonjour,

En utilisant l'API Win32 ? Si c'est le cas, il y a la fonction GradientFill() (dans le fichier d'entête windows.h) qui peut être utilisée pour ça. Voici ce que j'utilise pour remplir un triangle avec 3 couleurs :

// --- Remplir un triangle
// --- avec un gradient entre les couleurs des 3 sommets
void FillTriangularGradient
(
    HDC      hDC    // E:handle sur le DC
   ,int      iX1    // E:coordonnée x du sommet 1
   ,int      iY1    // E:coordonnée y du sommet 1
   ,int      iX2    // E:coordonnée x du sommet 2
   ,int      iY2    // E:coordonnée y du sommet 2
   ,int      iX3    // E:coordonnée x du sommet 3
   ,int      iY3    // E:coordonnée y du sommet 3
   ,COLORREF Color1 // E:couleur du sommet 1
   ,COLORREF Color2 // E:couleur du sommet 2
   ,COLORREF Color3 // E:couleur du sommet 3
)
{
   // --- Quitter si pas de DC
   if (hDC == NULL) return;




   // --- Remplir avec le gradient de couleurs
   TRIVERTEX Vertex[3];
   Vertex[0].x     = iX1;
   Vertex[0].y     = iY1;
   Vertex[0].Red   = MAKEWORD(0,GetRValue(Color1));
   Vertex[0].Green = MAKEWORD(0,GetGValue(Color1));
   Vertex[0].Blue  = MAKEWORD(0,GetBValue(Color1));
   Vertex[0].Alpha = 0;



   Vertex[1].x     = iX2;
   Vertex[1].y     = iY2;
   Vertex[1].Red   = MAKEWORD(0,GetRValue(Color2));
   Vertex[1].Green = MAKEWORD(0,GetGValue(Color2));
   Vertex[1].Blue  = MAKEWORD(0,GetBValue(Color2));
   Vertex[1].Alpha = 0;



   Vertex[2].x     = iX3;
   Vertex[2].y     = iY3;
   Vertex[2].Red   = MAKEWORD(0,GetRValue(Color3));
   Vertex[2].Green = MAKEWORD(0,GetGValue(Color3));
   Vertex[2].Blue  = MAKEWORD(0,GetBValue(Color3));
   Vertex[2].Alpha = 0;



   GRADIENT_TRIANGLE Triangle;
   Triangle.Vertex1 = 0;
   Triangle.Vertex2 = 1;
   Triangle.Vertex3 = 2;
  
   GradientFill(hDC,Vertex,3,&Triangle,1,GRADIENT_FILL_TRIANGLE);
}




Jean-François
Messages postés
69
Date d'inscription
lundi 10 février 2003
Statut
Membre
Dernière intervention
29 août 2012

Merci,

mais ce que je cherche c'est vraiment l'algorithme pour le dessiner
je ne dispose que de setpixel
pas d'autre fonctions ou api diverse
c'estjustement pour une coder une api que j'ai besoin de ca
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Ok ! Pour le contour du triangle, on peut utiliser l'algorithme de Bresenham qui permet de déterminer les pixels à "allumer" pour aller d'un point à un autre (d'un sommet à un autre). Voilà ce que donne cet algorithme pour tracer une ligne :

// --- Tracer une ligne entre (X1,Y1) et (X2,Y2)
// --- (algorithme de Bresenham)
void TracerLigne
(
    int iX1      // E:X du point 1
   ,int iY1      // E:Y du point 1
   ,int iX2      // E:X du point 2
   ,int iY2      // E:Y du point 2
   ,int iCouleur // E:couleur du bord
)
{
   int iX,iY;
   int iIncrX,iIncrY;
   int iDeltaX,iDeltaY,iDelta;
   int iTemp;





   iX = iX1;
   iY = iY1;
   SetPixel(iX,iY,iCouleur);
   iIncrX  = iX1 > iX2 ? -1 : 1;
   iIncrY  = iY1 > iY2 ? -1 : 1;
   iDeltaX = abs(iX1 - iX2);
   iDeltaY = abs(iY1 - iY2);
   if (iDeltaX >= iDeltaY)
   {
      iDelta = iDeltaX / 2;
      for (iTemp=0 ; iTemp= iDeltaX)
         {
            iY     += iIncrY;
            iDelta -= iDeltaX;
         }
         SetPixel(iX,iY,iCouleur);
      }
   }
   else
   {
      iDelta = iDeltaY / 2;
      for (iTemp=0 ; iTemp= iDeltaY)
         {
            iX     += iIncrX;
            iDelta -= iDeltaY;
         }
         SetPixel(iX,iY,iCouleur);
      }
   }
}

Pour ce qui est du remplissage avec/sans gradient, c'est encore à chercher !



Jean-François
Messages postés
69
Date d'inscription
lundi 10 février 2003
Statut
Membre
Dernière intervention
29 août 2012

merci,


 


j'en suis resté la aussi(toutes les sources que j'ai trouvée ,utilise ce principe pour le contour)


je pense qu'il doit etre possible ensuite de remplir par des ligne horizontal ou verticale pour chaque point
mais la combinaison de possibilitée me laisse sur le cul

de plus les ligne selon bresenham pour etre tout a fait optimisée bosse sur des test de quadrant
alors si je doit en tracée deux en meme temps je te dit pas les test ,mais je crois qu'il faut que je me lance
sinon j'ai entendu parler du clipping et je pense que c'est ce qui est utilisé pour la fonction gradient fill
car tu peux mettre autant de point que tu veux
mais la encore je vois mal le degradé
Messages postés
69
Date d'inscription
lundi 10 février 2003
Statut
Membre
Dernière intervention
29 août 2012

merci,


 


j'en suis resté la aussi(toutes les sources que j'ai trouvée ,utilise ce principe pour le contour)


je pense qu'il doit etre possible ensuite de remplir par des ligne horizontal ou verticale pour chaque point
mais la combinaison de possibilitée me laisse sur le cul

de plus les ligne selon bresenham pour etre tout a fait optimisée bosse sur des test de quadrant
alors si je doit en tracée deux en meme temps je te dit pas les test ,mais je crois qu'il faut que je me lance
sinon j'ai entendu parler du clipping et je pense que c'est ce qui est utilisé pour la fonction gradient fill
car tu peux mettre autant de point que tu veux
mais la encore je vois mal le degradé
Messages postés
280
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
8 juillet 2014
4
salut

tu as A,B,C

tu cherches le plus haut: disons A
tu cherches le plus bas: disons C
tu regardes si B est à gauche ou à droite de AC

si B est à gauche, on crée D appartenant à AC et à la même hauteur que B
puis on dessine en même temps AB et AD, en traçant en plus des lignes horizontales
puis on dessine en même temps BC et DC en traçant en plus des lignes horizontales

pour le remplissage avec degradé il suffit d'interpoler ta couleur sur AB et AD en même temps que tu fais le bresenham
et d'interpoler aussi quand tu dessines une ligne horizontale

je te conseille dans un permier temps de considérer que tes couleurs sont des flottants et de ne pas chercher à faire un bresenham pour interpoler les couleurs :)

note: en fait tu ne trouves pas D tout de suite, tu fais simplement un bresenham vertical (plus d'histoire d'octants!) tu trouves D quand tu arrives à la hauteur de B