Triangle plein en c

PADYVEN Messages postés 69 Date d'inscription lundi 10 février 2003 Statut Membre Dernière intervention 29 août 2012 - 23 juin 2008 à 12:54
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 - 24 juin 2008 à 19:05
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

cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
23 juin 2008 à 16:50
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
0
PADYVEN Messages postés 69 Date d'inscription lundi 10 février 2003 Statut Membre Dernière intervention 29 août 2012
23 juin 2008 à 18:48
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
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
23 juin 2008 à 19:44
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
0
PADYVEN Messages postés 69 Date d'inscription lundi 10 février 2003 Statut Membre Dernière intervention 29 août 2012
24 juin 2008 à 12:26
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é
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PADYVEN Messages postés 69 Date d'inscription lundi 10 février 2003 Statut Membre Dernière intervention 29 août 2012
24 juin 2008 à 12:26
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é
0
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
24 juin 2008 à 19:05
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
0
Rejoignez-nous