PADYVEN
Messages postés69Date d'inscriptionlundi 10 février 2003StatutMembreDernière intervention29 août 2012
-
23 juin 2008 à 12:54
acx01b
Messages postés280Date d'inscriptiondimanche 7 septembre 2003StatutMembreDerniè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
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 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;
PADYVEN
Messages postés69Date d'inscriptionlundi 10 février 2003StatutMembreDernière intervention29 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
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 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;
PADYVEN
Messages postés69Date d'inscriptionlundi 10 février 2003StatutMembreDernière intervention29 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é
Vous n’avez pas trouvé la réponse que vous recherchez ?
PADYVEN
Messages postés69Date d'inscriptionlundi 10 février 2003StatutMembreDernière intervention29 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é
acx01b
Messages postés280Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention 8 juillet 20146 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