Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2717 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  equation d'ellipse

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

equation d'ellipse

n°1045862
joeleclems
Posté le 13-04-2005 à 14:40:29  profilanswer
 

Bonjour,
J'ai une image représentée par un tableau et je cherche à dessiner une ellipse dans cette image... le problème c'est que je ne suis pas très fort en maths, alors les équations d'ellipse... Sauriez-vous comment utiliser une équation d'ellipse afin d'en dessiner une sur une image?  
merci d'avance

mood
Publicité
Posté le 13-04-2005 à 14:40:29  profilanswer
 

n°1045942
joeleclems
Posté le 13-04-2005 à 15:06:56  profilanswer
 

En cherchant sur le net j'ai trouvé cette équation :  
Ellipse : x = a.cos t  ,  y = b.sin t  
Savez vous comment l'utiliser?

n°1045993
joeleclems
Posté le 13-04-2005 à 15:36:19  profilanswer
 

J'ai trouvé mieux : x(t) = x0 + a.cos(t), y(t) = y0+ b.sin(t).
x0 et y0 sont les coordonnées du centre, a et b sont les distances du centre par rapport à la largeur et à la hauteur de l'image. Par contre t, ça représente quoi???

n°1045997
jagstang
Pa Capona ಠ_ಠ
Posté le 13-04-2005 à 15:37:25  profilanswer
 

tu confonds avec un cercle... une eclipse a deux foyers...

n°1046001
jagstang
Pa Capona ಠ_ಠ
Posté le 13-04-2005 à 15:38:47  profilanswer
 
n°1046002
joeleclems
Posté le 13-04-2005 à 15:39:17  profilanswer
 

non je ne confond pas, mais c'est une équation paramètrique... le seul truc qui coince c'est que je ne sais pas ce que représente 't' ...

n°1046007
FrozenPala​din
Posté le 13-04-2005 à 15:40:55  profilanswer
 

La formule que tu a fourni est a utiliser ainsi :
 
X0 et Y0 : les coordonnees du centre de l'ellipse.
A : la moitie de la longueur de l'axe horizontal de l'ellipse
B : la moitie de la longueur de l'axe vertical de l'ellipse
Tout les points de l'ellipses ont pour coordonnees :
X = X0 + (A * Cos(t))
Y = Y0 + (B * Sin(t))
 
Ainsi pour dessiner une ellipse, il suffit de connaitre X0, Y0, A et B.
Ensuite dans une boucle on fait varier t de 0 à 2*PI (PI = 3.1415), on utilise les formules précédentes pour calculer les coords de chaque point et on les affiche.
 
Remarque 1 : L'interval [0 ; 2*PI] permet de tracer l'ellipse entiere. Mais utiliser l'interval [PI/2 ; 3*PI/2] ne permet de tracer que la partie gauche de l'ellipse.
Remarque 2 : Les formules sont applicable dans un repere cartesien, il faut effectuer un changement de coordonnes pour obtenir la position des points sur un ecran ou une image.

n°1046018
LordHarryP​otter
Posté le 13-04-2005 à 15:44:41  profilanswer
 

heu en C++ (MFC) tu as la fonction Ellipse :D

n°1046028
joeleclems
Posté le 13-04-2005 à 15:47:37  profilanswer
 

merci pour ta réponse, et pour utiliser cette équation :  
x²/a² + y²/b² = 1 ?
Comment avoir le rayon? que représentent chaque membre? comment ajouter un centre?

n°1046050
FrozenPala​din
Posté le 13-04-2005 à 15:57:06  profilanswer
 

Cette seconde equation est dite cartesienne. C'est a dire que les variables x et y sont liees dans une meme equation.
a et b represente le meme chose que dans les equations parametriques precédentes.
Cependant cette equation est un peu particuliere car elle ne represente que des ellipses centrees sur (0,0). (Il est toutefois possible de la modifier pour choisir un autre centre)
 
Ainsi de memoire :
((X-X0)/A)² + ((Y-Y0)/B)² = 1
 
edit : correction formule  :D


Message édité par FrozenPaladin le 13-04-2005 à 15:59:30
mood
Publicité
Posté le 13-04-2005 à 15:57:06  profilanswer
 

n°1046078
joeleclems
Posté le 13-04-2005 à 16:05:58  profilanswer
 

ok merci :-)
je teste et je te tiens au courant

n°1046237
joeleclems
Posté le 13-04-2005 à 17:17:17  profilanswer
 

il ne manquerait pas un rayon ou quelque chose dans le genre? j'obtiens des résultats étranges : au lieu de tracer une ellipse, ça me trace une croix très épaisse...
Si on se base sur l'équation d'un cercle, ((X-X0)/A)² + ((Y-Y0)/B)² = r² : c'est correct ou je dis une grosse connerie lol?

n°1046243
FrozenPala​din
Posté le 13-04-2005 à 17:20:16  profilanswer
 

L'equation n'est pas celle d'un cercle mais d'une ellipse. En fait meme pas.
Ellipse :
((X-X0)/A)² + ((Y-Y0)/B)² = 1
X = X0 + (A * Cos(t))  
Y = Y0 + (B * Sin(t))  
 
Cercle :
(X-X0)² + (Y-Y0)² = R² (R = rayon du cercle)
X = X0 + (R * Cos(t))  
Y = Y0 + (R * Sin(t))  
 
Remarque :
Pour l'ellipse, si A = B, alors c'est un cercle.  ;)  
De plus en general pour la programmation on utilise les equations parametriques qui permettent de tracer la figure avec une simple boucle.


Message édité par FrozenPaladin le 13-04-2005 à 17:24:23
n°1046334
joeleclems
Posté le 13-04-2005 à 17:41:20  profilanswer
 

Voila ce que je fais : au lieu de me faire une ellipse, ça me trace une grosse croix! je comprends pas pourquoi :cry:  
A cause d'une approximation peut-être? vous avez une idée?

Citation :


  w2 = image->_w >> 1;//Division par deux (décalage de 1 sur la droite)
  h2 = image->_h >> 1;
  axe_h_ellipse = ((8*h2/10) >>1);
  axe_w_ellipse = ((8*w2/10) >>1);
  centre_x = w2 ;  
  centre_y = h2 ;
  for(int l = 0; l < image->_h; l++)  
     for(int c = 0; c < image->_w; c++)  
      {  
         ind = c + l * image->_w;
         recentre_x = (int)((c - centre_x)/ axe_w_ellipse);  
         recentre_y = (int)((l - centre_y)/ axe_h_ellipse);  
         distance_au_centre = recentre_x * recentre_x + recentre_y * recentre_y;
         // POUR FAIRE UNE ELLIPSE NOIRE SUR L'IMAGE  
         if( distance_au_centre <= 1)
        image->_norme[ind] = 0.0; //norme contient les pixels de l'image
 


Message édité par joeleclems le 13-04-2005 à 17:43:19
n°1046352
LordHarryP​otter
Posté le 13-04-2005 à 17:47:10  profilanswer
 

joeleclems a écrit :

Voila ce que je fais : au lieu de me faire une ellipse, ça me trace une grosse croix! je comprends pas pourquoi :cry:  
A cause d'une approximation peut-être? vous avez une idée?

Citation :


  w2 = image->_w >> 1;//Division par deux (décalage de 1 sur la droite)
  h2 = image->_h >> 1;
  axe_h_ellipse = ((8*h2/10) >>1);
  axe_w_ellipse = ((8*w2/10) >>1);
  centre_x = w2 ;  
  centre_y = h2 ;
  for(int l = 0; l < image->_h; l++)  
     for(int c = 0; c < image->_w; c++)  
      {  
         ind = c + l * image->_w;
         recentre_x = (int)((c - centre_x)/ axe_w_ellipse);  
         recentre_y = (int)((l - centre_y)/ axe_h_ellipse);  
         distance_au_centre = recentre_x * recentre_x + recentre_y * recentre_y;
         // POUR FAIRE UNE ELLIPSE NOIRE SUR L'IMAGE  
         if( distance_au_centre <= 1)
        image->_norme[ind] = 0.0; //norme contient les pixels de l'image
 



 
 
elle est où ta boucle for :
 

Code :
  1. // nombre de point deton ellipse
  2. double Tmax = 20.0 ;
  3. for(int t=0:t<Tmax;t++)
  4. {
  5.    x_new = x0+A*cos(t*2*Pi/Tmax) ;
  6.    y_new = y0+B*sin(t*2*Pi/Tmax) ;
  7. }


Message édité par LordHarryPotter le 13-04-2005 à 17:54:49
n°1046364
FrozenPala​din
Posté le 13-04-2005 à 17:51:51  profilanswer
 

J'ai rien compris  :pt1cable: .
Poste un vrai code avec les balises C++ et un algo clair. En fait je vois meme pas l'utilisation des formules.

n°1046365
joeleclems
Posté le 13-04-2005 à 17:53:02  profilanswer
 

oups, je n'avais pas vu les balises de codes, désolé...
Ma boule for? ben elle est ligne 7-8!

Code :
  1. w2 = image->_w >> 1;//Division par deux de la largeur(décalage de 1 sur la droite)  
  2.   h2 = image->_h >> 1;//Division par deux de la hauteur(décalage de 1 sur la droite)  
  3.   axe_h_ellipse = (8*h2/10); //Correspond à A : on prend 8 dixieme de la moitié de la hauteur de l'image
  4.   axe_w_ellipse = (8*w2/10); //Correspond à B : on prend 8 dixieme de la moitié de la largeur de l'image
  5.   centre_x = w2 ;  //X0
  6.   centre_y = h2 ;  //Y0
  7.   for(int l = 0; l < image->_h; l++)
  8.   {
  9.      for(int c = 0; c < image->_w; c++) 
  10.       { 
  11.          ind = c + l * image->_w; //Permet de parcourir le tableau des pixels de l'image
  12.          recentre_x = (int)((c - centre_x)/ axe_w_ellipse);  // (X - X0)/A
  13.          recentre_y = (int)((l - centre_y)/ axe_h_ellipse);  // (Y - Y0)/B
  14.          distance_au_centre = recentre_x * recentre_x + recentre_y * recentre_y; //((X - X0)/A)² + ((Y - Y0)/B)²
  15.          // POUR FAIRE UNE ELLIPSE NOIRE SUR L'IMAGE   
  16.          if( distance_au_centre <= 1) //SI ((X - X0)/A)² + ((Y - Y0)/B)² <=1 alors on est dans l'ellipse
  17.             image->_norme[ind] = 0.0; //norme contient les pixels de l'image  
  18.       }
  19.   }


Message édité par joeleclems le 13-04-2005 à 18:03:24
n°1046368
LordHarryP​otter
Posté le 13-04-2005 à 17:56:07  profilanswer
 

oki mais t'as deux boucles for ??? et normalement tu n'en as qu'une :(

n°1046371
joeleclems
Posté le 13-04-2005 à 17:58:05  profilanswer
 

parce que je parcours une image (donc deux dimensions), c'est pourquoi j'ai besoin d'une boucle for pour parcourir les lignes (l) et une pour parcourir les colonnes (c).

n°1046374
FrozenPala​din
Posté le 13-04-2005 à 18:00:39  profilanswer
 

Bah en fait le principe c'est de faire varier un angle de 0 a 2*PI. Avec les equations parametriques on calcule la position du point correspondant et on l'affiche sur l'image. Mais on ne parcoure pas toute l'image pour dessiner les pixels sur l'ellipse, c'est une perte de temps !  :(

n°1046377
joeleclems
Posté le 13-04-2005 à 18:04:14  profilanswer
 

Le problème c'est que j'ai besoin de parcourir toute l'image pour faire la somme de tous les pixels qui ne se trouvent pas dans l'ellipse!

n°1046973
joeleclems
Posté le 14-04-2005 à 09:18:14  profilanswer
 

On dirait un problème de cast, et pourtant même sans le cast ça me donne le même resultat :-(

n°1046990
Lam's
Profil: bas.
Posté le 14-04-2005 à 09:28:47  profilanswer
 

LordHarryPotter a écrit :

oki mais t'as deux boucles for ??? et normalement tu n'en as qu'une :(


Non
 

FrozenPaladin a écrit :

Bah en fait le principe c'est de faire varier un angle de 0 a 2*PI. Avec les equations parametriques on calcule la position du point correspondant et on l'affiche sur l'image. Mais on ne parcoure pas toute l'image pour dessiner les pixels sur l'ellipse, c'est une perte de temps !  :(


et Non.
Son algo est correct: il veut afficher la partie de l'image qui se trouve dans l'ellipse, pas afficher une ellipse comme ça (en plus, le faire en parametrique, c'est pas une bonne idée sur un écran d'ordinateur). Certes, l'algo de Bresenham pour les cercles serait plus efficace, mais passons.
 

joeleclems a écrit :

On dirait un problème de cast, et pourtant même sans le cast ça me donne le même resultat :-(


On voit pas le type de tes variables (recentre_x ou axe_w_ellipse par exemple). Pourquoi ne déclares tu pas la variable seulement lorsque tu lui donne sa valeur ?
 

n°1046995
joeleclems
Posté le 14-04-2005 à 09:33:38  profilanswer
 

oups, il me restait une variable déclarée en int...  :pfff:  
merci pour votre aide

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  equation d'ellipse

 

Sujets relatifs
recup de l'equation du graphique dans excel[VB] Tracer une ellipse?
Problème résolution équation sous MatlabCréer une ellipse et pouvoir la deplacer a la souris
[OpenGL] Une bonne equation pour heightmap avec grayscaleéquation en js
Afficher (joliment et proprepent) une equation ?equation à deux inconue
[HS] Resolution d'equationPHP & équation de récurrence
Plus de sujets relatifs à : equation d'ellipse


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)