Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : triangle plein en c [ Algorithme / Maths ] (PADYVEN)

lundi 23 juin 2008 à 12:54:24 | triangle plein en c

PADYVEN

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

lundi 23 juin 2008 à 16:50:48 | Re : triangle plein en c

jfrancois

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


lundi 23 juin 2008 à 18:48:08 | Re : triangle plein en c

PADYVEN

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

lundi 23 juin 2008 à 19:44:16 | Re : triangle plein en c

jfrancois

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 ; ++iTemp)
      {
         iX     += iIncrX;
         iDelta += iDeltaY;
         if (iDelta >= iDeltaX)
         {
            iY     += iIncrY;
            iDelta -= iDeltaX;
         }
         SetPixel(iX,iY,iCouleur);
      }
   }
   else
   {
      iDelta = iDeltaY / 2;
      for (iTemp=0 ; iTemp<iDeltaY ; ++iTemp)
      {
         iY     += iIncrY;
         iDelta += iDeltaX;
         if (iDelta >= 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


mardi 24 juin 2008 à 12:26:57 | Re : triangle plein en c

PADYVEN

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é


mardi 24 juin 2008 à 12:26:59 | Re : triangle plein en c

PADYVEN

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é


mardi 24 juin 2008 à 19:05:19 | Re : triangle plein en c

acx01b

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



Cette discussion est classé dans : cherche, triangle, sommet


Répondre à ce message

Sujets en rapport avec ce message

chaos game 2 en c++ [ par clira82 ] coucou je recherche de l aide pour programmer un jeu en visual c++c'est un triangle de sierpinski en recursif:Il y a un point a chaque sommet du grand Cherche codeur motivé [ par Delirium ] Cherche un codeur avec pas mal d'expériance en C/C++ pour creer quelques code pour un serveur IRC (place d'admin) ainsi pour créer de nouveau services Comment mettre de la transparance dans un composant?? [ par OrsE ] Bon c pas vraiment de l'API, mais c un problème avec builder...En fait j'ai crée un composant qui dérive d'un TCustomControl, donc j'affiche des chose étudiant cherche un developpeur à interviewer ! [ par o00zeus00o ] Salut@tous, je suis étudiant en informatique et je dois interviewer une personne exercant le metier qui m'interesse, je cherche donc un developpeur pr #if et #include [ par Xilofeon ] salutvoila je cherche le moyen d'inclure une ressource externe que si c'est celle si est présente et installé.En gros ma ressource n'est pas indispens cherche une source [ par alilabs ] salutje suis étudiant et je suis nouveau dans ce domaines de programmation, je trouve votre site est vraiment interessent et riches des infos.actuel Update de statusbar [ par alf69 ] bonjour tt le monde Je cherche a réaliser l'update de ma statusbar(qui ce trouve ds CMainFrame), dans le callback qui lui ce trouve ds CChieldView. Je tester si un fichier existe [ par desquesa ] Bonjour tout le monde,je voudrais juste savoir comment tester en Visual c++6, si un fichier existe ou non, car en fait je cherche a copier un fichier comment inclure une dll dans une dll? [ par giova ] Bonjour. Je cherche a faire une dll qui servent d'interface en C pour une autre dll qui elle est en C++ je suis debutant, j'arrive a faire une dll bas Objet Point et Triangle pb a la compilation [ par fatcat ] Salut a tousVoila mon petit pbJe dois créer un programme qui effectue une triangulation de delauanay a partir d un fichier de Point avec 2 "double" co


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,718 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.