Tracer un cercle

giudy Messages postés 4 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 6 octobre 2008 - 6 oct. 2008 à 13:37
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 - 9 oct. 2008 à 20:17
Bonjour ,

Je suis entrain d'écrire un programme qui trace un cercle (sans utiliser de fonctions trigonométriques ,  en  tracé continu et les points calculés doivent être contigüs) .

J'ai illustré mon algorithme avec l'exemple suivant : je veux tracer un cercle de centre (10,10) et de rayon R=5 . On part du pixel de coordonnées (15,10) (qui appartient forcément au cercle) . Je commence par tracé le quart du cercle nord-est , sachant que le prochain pixel sera forcément  soit celui qui se trouve immédiatement au nord (15,9) (ici d^2 qui est la distance au centre = 26) soit celui se trouvant à l'ouest (14,10)(pour celui là d^2=16) , soit celui au nord-ouest (14,9) ( pour celui ci d^2=17) .

Sachant que R^2=25 , on sélectionne le point dont la distance (au carré) au centre est la plus proche de 25 : j'ai pris le point de coordonnées (15,9). On répète cette opération jusqu'au point correspndant à pi/2 .

Je commence par écrire le programme C qui créé une fenêtre de 400*400 puis y trace un cercle de 100 pixels de rayon dont le centre se trouve aux coordonnées (200,200) :

#include <stdio.h>
#include <graphics.h>

int main ( ) {
 int i ; int R = 5
creer_fenetre (400 , 400 , "white" , "black")
for (i=100 ; i<=300 ; i++)
afficher_point (100 , i) ;

/* Là ou je bloque , c'est que je voudrais utiliser la distance euclidienne pour calculer à chaque fois la distance d (distance au centre) mais je ne vois pas l'algorithme que je peux écrire pour utiliser cette formule ? (si on prend par ex deux points P1(x1,y1) et P2(x2,y2) et que d(P1,P2) = sqrt { (x1-x2)^2 + (y1-y2)^2 } */ 

J'espère avoir été clair pour l'énoncé !

Merci de m'aider .

Giudy

2 réponses

cs_genko Messages postés 1 Date d'inscription lundi 6 octobre 2008 Statut Membre Dernière intervention 6 octobre 2008
6 oct. 2008 à 14:31
Bonjour Giudy,
Si je comprends bien, tu veux implémenter  /* (x1,y1) et P2(x2,y2) et que d(P1,P2) = sqrt { (x1-x2)^2 + (y1-y2)^2 } */.
Alors sers toi du fichier d'entête "math.h"  et utilise la fonction "pow" qui traite les puissances qu'elles soient entières ou réelles. Au fait  avec la fonction pow, si x et y sont deux réels, x^y = pow(x,y). Et comme sqrt(x) est encore x^(0.5)
Tu peux donc faire comme ceci:
# include<math>
d = pow(pow(x1 - x2,2)  + pow(y1 - y2,2), 0.5);


J'espère que cela t'aidera.

Merci.
Genko
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
9 oct. 2008 à 20:17
Salut, si ça peut t'aider,

_virtuel  =  la zone mémoire ou dessiner (surface DDraw par exemple)
cx = centre x horizontal
cy = centre y vertical
r = rayon
ECRAN_X = résolution horizontale

void circle(UCHAR* _virtuel, int cx, int cy, int r, unsigned char coul)
{
 int x, y;


 for(x=-r; x<r; x++)
 {
     y = (int)sqrt(r*r - x*x);
  _virtuel[(cy+y)*ECRAN_X+x+cx] = coul;
  _virtuel[(cy-y)*ECRAN_X+x+cx] = coul;
 }
}
0
Rejoignez-nous