J'essaye de tracez un cercle à l'aide d'une matrix Rotation sur une image

Résolu
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008 - 10 janv. 2008 à 14:08
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 - 16 janv. 2008 à 14:11
Salut à tous,
svp, je dois tracez un cercle à l'aide d'une matrix de rotation (dimension 2)
et j'utilise la matrix suivante avec Coordonnés Homogene:
(x')    (x)   (cos(a)  -sin(a)  xm * (1 - cos(a)) + ym * sin(a))
(y') = (y) * (sin(a)   cos(a)  ym * (1 - cos(a)) - xm * sin(a))
 (1 )   (1)   (  0                      0                      1             )

et j'obtiens cet Algoritme :

#include "Drehmatrix.h"

extern FrameGrabber *fg;
extern BYTE *puffer1;  // Originalbild
extern BYTE *puffer2;  // ziel Bil



// Bildmitte ermitteln MAX_ZEILE ist 576 und MAX_SPALTE ist 768
const int Xm = MAX_SPALTE / 2;
const int Ym = MAX_ZEILE / 2;

void Drehmatrix(HDC hdc,COLORREF farbe)
{
 double x_Neu, y_Neu;
 double phi;
 
 int pixel;
 
 double radius = 100.5;
 
 int x_puffer1, y_puffer1;
 
 int x, y, i;
 
 //Umrechnung von Grad nach Bogenmass
 //phi = PI * phi_in_deg / 180;



 pixel=(int)(2.0*(double)radius*PI);
 
 
 for (y = 0; y < MAX_ZEILE; y++)
 {
  for (x = 0; x < MAX_SPALTE; x++)
  {
     i = y * MAX_SPALTE + x;



            phi =(double)i/pixel*2*PI;
    
   // Koordinaten aus dem originalen Bild ermitteln
  
   x_Neu =(double) Xm + cos(phi) * (double)(x - Xm) - sin(phi) *(double) (y - Ym);
   
   
   y_Neu = (double)Ym + sin(phi) * (double)(x - Xm) + cos(phi) * (double)(y - Ym);
     

   // originalen Bild neu Koordinaten
   x_puffer1 =  (int) (x_Neu);
   y_puffer1 = (int) (y_Neu);



   SetPixel (hdc, x_puffer1, y_puffer1 ,farbe);



   
  }
 }



}




 



LRESULT CALLBACK DialogProc_Drehmatrix(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{



 //COLORREF farbe = RGB(255,0,0);
 COLORREF farbe;
  
 switch (message)



 {



  case WM_PAINT:



    HDC      hdc;
    PAINTSTRUCT   ps;
          farbe = 0x0000FF;
    hdc = BeginPaint(hwnd, &ps);   //ganze Bild
       fg->ZeichneFrame(2,hwnd);//
     Drehmatrix(hdc, farbe);



    EndPaint(hwnd, &ps);



    return 0;



    break;




 



  default:       // Nachrichten weiterleiten



    return DefWindowProc(hwnd, message, wParam, lParam);



 



   }



   return 0;




}



mon Problem est que au lieu d'obtenir un cercle j'ai plusieurs cercles.
SVP aidez moi je voudrais bien obtenir un Cercle

43 réponses

laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
10 janv. 2008 à 17:42
malheuresement je viens de montrer au prof il n'est pas satisfait. peut être c'est moi qui est mal expliquée l'énonce de l'exercise en prinzipe il sagit de :

Dessinent un cercle avec le Raduis 100.5 autour du milieu de l'image (383.5, 287.5 ) avec l'utilisation successivement par l'application d'une matrice de rotation (dim 2) avec une rotation constante.
Choix de l'angle de début phi et une constante deltaphi progressivement de sorte que tous les pixels qui se situent côte à côte puissent former une ligne de Cercle.

j'ai essayer de traduire en francais pourque tu puisses comprendre ce que j'avais à faire au début?

bon j'ai un cercle et le prof trouve que je n'ai pas considérée tous les pixels voisins.
donc le MAX_ZEILE et le MAX_SPALTE
Stp comprends tu un peu?
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
10 janv. 2008 à 18:02
J'ai un peu de mal a comprendre ce que tu cherches a faire.

En fait c'est le principe de rotation constante que je ne comprend pas.
Pour les pixels voisins, il suffit de deesiner les pixels voisins;



SetPixel (hdc, x_puffer1, y_puffer1 ,farbe);
SetPixel (hdc, x_puffer1+1, y_puffer1 ,farbe);
SetPixel (hdc, x_puffer1-1, y_puffer1 ,farbe);
SetPixel (hdc, x_puffer1, y_puffer1+1 ,farbe);
SetPixel (hdc, x_puffer1, y_puffer1-1 ,farbe);
SetPixel (hdc, x_puffer1+1, y_puffer1+1 ,farbe);
SetPixel (hdc, x_puffer1-1, y_puffer1-1 ,farbe);
SetPixel (hdc, x_puffer1+1, y_puffer1-1 ,farbe);
SetPixel (hdc, x_puffer1-1, y_puffer1+1 ,farbe);

Mon site internet : http://pistol.petesampras.free.fr
0
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
10 janv. 2008 à 20:42
j'ai l'impression qu'il parle de trouver le delta phi:

je pense que ma technique pourra marcher: en disant que sur un cercle de rayon r il y a moins de points que sur un carré de côté 2r donc moins de 8r points donc deltaphi pourra être 2Pi / 4r

Renaud
0
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
11 janv. 2008 à 17:15
salut
excusez pour hier je n'avais plus la possibilité de Surfer
je n'ai pas encore résolut le problème.
ariez vous le temps Dimanche là je pourrais continuer à poser mes questions car en ce moment je n'ai pas d'internet?
merci d'avance pour la compréhension
0

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

Posez votre question
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
11 janv. 2008 à 17:16
je vais aussi essayer avec ta methode pour les pixels Voisins
je te dirai Dimanche si cela à funktioné
0
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
11 janv. 2008 à 17:18
Slut Renaud,
peut un peu plus être précis? car je ne comprends pas très bien ton Idée
0
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
11 janv. 2008 à 17:28
si deltaphi pourra être 2Pi / 4r comment pourra tu alors interpreter celà dans mon code?
a quel niveau vois tu celà?
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
11 janv. 2008 à 22:34
Salut

Je pense qu'il veut dire que le pas pour tracer le rayon peut etre determiné  en fonction du rayon du cercle à tracer:

Donc au lieu de for(Phi=0; Phi < 2*pi ; Phi+=0.01)
tu aurais for(Phi=0; Phi < 2*pi ; Phi+=deltatphi)     

en initialisant deltaphi a 2PI/4r

A+

Mon site internet : http://pistol.petesampras.free.fr
0
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
11 janv. 2008 à 22:44
ok  j'essaye un peu son idée et te tien au courant du résultat
a++
0
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
11 janv. 2008 à 22:55
Voici mon nouveau code :
#include "Drehmatrix.h"


extern FrameGrabber *fg;
extern BYTE *puffer1;  // Originalbild
extern BYTE *puffer2;  // ziel Bil



// Bildmitte ermitteln MAX_ZEILE ist 576 und MAX_SPALTE ist 768
const int Xm = MAX_SPALTE / 2;
const int Ym = MAX_ZEILE / 2;
void Drehmatrix(HDC hdc,COLORREF farbe)
{
 double x_Neu, y_Neu;
 
 double phi;
 
 //int pixel;
 
 double radius = 100.5;
 
 int x_puffer1, y_puffer1;
 
 int x, y;
  //i;
 

     x= -1;
     y=0;



     double deltatphi = (2*PI) /(4 * radius);



    
        for(phi=0; phi < 2*PI ; phi+=deltatphi)  
   { 
   
       x_Neu =(   x*cos(phi) + y*sin(phi))  *  radius  + Xm;
            y_Neu =(  -x*sin(phi) + y*cos(phi))  *  radius  + Ym;



   // originalen Bild neu Koordinaten
   x_puffer1 =  (int) (x_Neu);
   y_puffer1 = (int) (y_Neu);



   
   SetPixel (hdc, x_puffer1, y_puffer1 ,farbe);
               SetPixel (hdc, x_puffer1+1, y_puffer1 ,farbe);
             SetPixel (hdc, x_puffer1-1, y_puffer1 ,farbe);
          SetPixel (hdc, x_puffer1, y_puffer1+1 ,farbe);
           SetPixel (hdc, x_puffer1, y_puffer1-1 ,farbe);
           SetPixel (hdc, x_puffer1+1, y_puffer1+1 ,farbe);
          SetPixel (hdc, x_puffer1-1, y_puffer1-1 ,farbe);
         SetPixel (hdc, x_puffer1+1, y_puffer1-1 ,farbe);
           SetPixel (hdc, x_puffer1-1, y_puffer1+1 ,farbe);
   
   }
   }

j'obtiens toujours le même Cercle je ne sais plus quoi faire ?
0
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
13 janv. 2008 à 14:11
salut es tu là today?
A++
0
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
14 janv. 2008 à 12:44
Salut,
j'ai essayer de changer mon algorithme il est maintenant logique mais ne functionne pas ai je faite une erreur
SVP aidez moi

void Drehmatrix(HWND hwnd,COLORREF farbe)
{
    HDC hdc = GetDC(hwnd);
   
    double RADIUS = 100.5;

    int x0 = 0;
    int y0 = RADIUS;
    int x1 = 0;
    int y1 = 0;
    double theta = 0.0;
    double dTheta = 0.0;
   
     // Minimal theta berechnen
    y1 = 1;
   dTheta = acos(sqrt(9999.0) / RADIUS);
   theta = dTheta;
   
  x1 = int(cos(dTheta) * RADIUS + 0.5);
   //SetPixel(hdc, x1 + MAX_SPALTE/2, y1 + MAX_ZEILE/2, farbe);
 while(theta <= 2.0 * PI)
 {
  theta += dTheta;
  x1 = int(cos(theta) * RADIUS + 0.5);
  y1 = int(sin(theta) * RADIUS + 0.5);
  SetPixel(hdc, x1 + MAX_SPALTE/2, y1 + MAX_ZEILE/2, farbe);
 
 }
}
Merci bien
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
15 janv. 2008 à 09:35
Salut, parrait bien ton programme.
Mais pourquoi tu as le  +0.5  dans   x1 = int(cos(theta) * RADIUS + 0.5);
Qu'est ce qu'il trace a l'ecran?

Personnellement je preferait l'ancienne version.

A+
Mon site internet : http://pistol.petesampras.free.fr
0
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
15 janv. 2008 à 11:04
salut,
le 0.5 c'est l'arrondissement en allemand c'est le kaufmänische Rundung.
Qu'est ce qu'il trace a l'ecran? => justement il ne trace rien c'est pour cela que je voulais que vour regardiez ou est ce que j'aurai faite une erreur
A++
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
15 janv. 2008 à 11:21
Je ne peux pas compiler ici.
Mais toi tu peux debugger:  met un break point sur la ligne  SetPixel(), et regarde les valeurs x1 et x2 pour chaques valeurs de theta.
Comme ca tu sais exactement qu'elles sont les points que tu traces.

Regarde bien aussi Theta; je pense que tu ne trace pas assez de points a l'ecran.

Regarde ton dTheta, il est egale a 0.78
Et ta condition est theta <2pi
Tu ne traces que 8 points !!!!!

Change ton dTheta et met dTheta=0.01 

A+
Mon site internet : http://pistol.petesampras.free.fr
0
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
15 janv. 2008 à 11:39
tu as raison j'obtiens maintenant un cercle
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
15 janv. 2008 à 12:12
Alors tout va bien ?

Mon site internet : http://pistol.petesampras.free.fr
0
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
15 janv. 2008 à 19:32
oui tout va bien maintenant Merci

j'ai une question sur Hough
1) j'ai tracez des lignes Vertikales et horizontales sur une feuille
2) j'ai filmer avec la camera du Labor(comme image.tbs)
3) ensuite je les passée sur un Sobel filter je recois une image avec des kantes

ma questions est la suivante :
1) comment puis je implementer une  hough-Transformations (houghdroite)des bordures de droite
2) comment commencer

merci
0
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
15 janv. 2008 à 21:45
salut,
est ce  que c'est possible de pouvoir dessiner 4 Cercles de couleur differente en même temps avec la methode SetPixel
exemple coe ds mon programm ->
SetPixel(hdc, x1 + MAX_SPALTE/2, y1 + MAX_ZEILE/2, farbe);
Mercie
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
16 janv. 2008 à 09:59
Salut

En ce qui concerne les cercles, tu as fais une fonction qui permet de tracer un cercle d'une couleur determiner:

void Drehmatrix(HWND hwnd,COLORREF farbe) 

Maintenant, pour rendre generique cette fonction, il faut que tu ajoute le rayon et la position du cercle en argument.
Ca te donnera une fonction de la sorte:
void Drehmatrix(HWND hwnd, double Rayon, int posX, int posY, COLORREF farbe)    //en modifiant un peu ta fonction

Ainsi, pour dessiner 4 cercles, tu appeleras 4 fois cette fonction avec les parametres que tu veux.
La tu as le controle sur la position du centre du cercle, le rayon et la couleur. 

Mon site internet : http://pistol.petesampras.free.fr
0
Rejoignez-nous