2017-09-12 2 views
-1

Mon algorithme cercle milieu du programme C est donnée ci-dessous:Midpoint algorithme Cercle ne fonctionne pas pour le centre inégal coordonne

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

void cir(int,int,float); 
void main() 
{ 
    int gd=DETECT; 
    int gm=DETECT; 
    int x1,y1; 
    float r; 
    initgraph(&gd,&gm,"C:\\TurboC3\\BGI"); 
    printf("\nenter the cordinates of center: "); 
    scanf("%d",&x1); 
    scanf("%d",&y1); 
    printf("\nenter the radius : "); 
    scanf("%f",&r); 
    cir(x1,y1,r); 
    getch(); 
    closegraph(); 
} 

void cir(int x1,int y1,float r) 
{ 
    int x,y; 
    float d; 
    x=0; 
    y=r; 
    d=1.25-r; 
    putpixel(x1+x,y1+y,RED); 
    putpixel(y1+y,x1+x,RED); 
    putpixel(y1+y,x1-x,RED); 
    putpixel(x1+x,y1-y,RED); 
    putpixel(x1-x,y1-y,RED); 
    putpixel(y1-y,x1-x,RED); 
    putpixel(y1-y,x1+x,RED); 
    putpixel(x1-x,y1+y,RED); 
    while(x<y){ 

     if(d<0){ 
      x=x+1; 
      d=d+2*x+1; 
     }else{ 
      x=x+1; 
      y=y-1; 
      d=d+2*(x-y)+1; 
     } 
     putpixel(x1+x,y1+y,RED); 
     putpixel(y1+y,x1+x,RED); 
     putpixel(y1+y,x1-x,RED); 
     putpixel(x1+x,y1-y,RED); 
     putpixel(x1-x,y1-y,RED); 
     putpixel(y1-y,x1-x,RED); 
     putpixel(y1-y,x1+x,RED); 
     putpixel(x1-x,y1+y,RED); 
    } 
} 

Quand je fournir les coordonnées du centre comme (200,200) la sortie est un cercle parfait mais quand je donne une autre coordonnée où (Y<X) exemple (200,140) la sortie n'est pas un cercle parfait. S'il vous plaît suggérer si des modifications sont nécessaires dans mon code.

La fonction cir met en œuvre l'algorithme du cercle médian. L'algorithme du point central ne fonctionne-t-il que pour des coordonnées de centre égales?

+0

Utilisez-vous le Bloc-notes comme éditeur de code? Sinon, je ne vois pas une bonne raison pour une telle indentation plate. –

+0

désolé pour l'indentation, j'étais pressé – user7425787

+0

Si les arguments de putpixel() sont x, y, couleur, alors vous mélangez x et y dans un grand nombre d'appels. –

Répondre

0

Le résultat de cela est incohérent car y ne démarrera pas correctement pour tout flottement et d également. Pourquoi utilisez-vous un type flottant dans un algorithme basé sur un nombre entier et avec un pixel comme unité?

changement

d=1.25-r; 

à

d=1-r; 

et tout type de flotteur type int.

comme l'incrémentation est de 1/-1

+0

voir: http://www.vrarchitect.net/anu/cg/Circle/printCG.en.html –