c畫圓演算法
『壹』 c語言畫圓
把整個表格當作一個矩陣...
或者圓的直徑為邊長的正方形覆蓋的表格為矩陣...
或者用窮舉...滿足到圓心直線距離與半徑長的差在一定范圍內的點才保留...
『貳』 利用C語言編寫 能夠畫出任意圓演算法程序(利用畫點函數)
上次剛寫過,在VC下運行的,
int
dx,dy,incrE,incrNE,d,x,y;
if
((point[1].x-point[0].x)==0){
//垂直的直線
x=point[0].x;
for(y=point[0].y;y<point[1].y;y++)
pDC->SetPixel(x,y,50);
}
else
if(abs((point[1].y-point[0].y)/(point[1].x-point[0].x))<=1){
//斜率
-1到
1
之間
dx=point[1].x-point[0].x;
dy=point[0].y-point[1].y;
d=dx-2*dy;
incrE=-2*dy;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC->SetPixel(x,y,50);
if(point[0].y>point[1].y){
while(x<point[1].x)
{
if(d>=0){
d+=incrE;
x++;
}
else
{d+=incrNE;
x++;
y--;
}
pDC->SetPixel(x,y,50);
}
}
else
if(point[0].y<=point[1].y){
dy=point[1].y-point[0].y;
incrE=-2*dy;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC->SetPixel(x,y,50);
while(x<point[1].x)
{
if(d>=0){
d+=incrE;
x++;
}
else
{d+=incrNE;
x++;
y++;
}
pDC->SetPixel(x,y,50);
}
}
}
else
{
//斜率
<-1
和
>1的直線
if(point[1].x>=point[0].x){
dx=point[1].x-point[0].x;
dy=point[1].y-point[0].y;
d=2*dx-dy;
incrE=2*dx;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC->SetPixel(x,y,50);
while(x<point[1].x)
{
if(d<0){
d+=incrE;
y++;
}
else
{d+=incrNE;
pDC->SetPixel(x,y,50);
x++;
y++;
}
pDC->SetPixel(x,y,50);
}
}
else
if((point[1].y-point[0].y)/(point[1].x-point[0].x)<-1){
dx=point[1].x-point[0].x;
dy=point[0].y-point[1].y;
d=2*dx-dy;
incrE=2*dx;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC->SetPixel(x,y,50);
while(y<point[1].y)
{
if(d>0){
d+=incrE;
y++;
}
else
{d+=incrNE;
x--;
y++;
}
pDC->SetPixel(x,y,50);
}
}
}
『叄』 如何用C語言畫一個園
#include <stdio.h>
#include  <math.h>
void main()
{
double y;
int x,m;
for(y=10;y>=-10;y--)
{
m=2.5*sqrt(100-y*y); /*計算行y對應的列坐標m,2.5是屏幕縱橫比調節系數因為屏幕的
行距大於列距,不進行調節顯示出來的將是橢圓*/
for(x=1;x<30-m;x++) printf(" "); /*圖形左側空白控制*/
printf("*"); /*圓的左側*/
for(;x<30+m;x++) printf(" "); /*圖形的空心部分控制*/
printf("*\n"); /*圓的右側*/ 
}
}
『肆』 畫圓的常見演算法
畫圓的基本演算法有逐點比較和DDA積分法,
代碼示例  WinC下運行
#include "Conio.h"
#include "graphics.h"
#include "process.h"
#define  Ni_circle 0
#define  Shun_circle 1
#define closegr closegraph
void initgr();
void draw_Base_circle();
void draw_cabu_circle();
void close_graph();
void acrroods();
static float x0,y0;
void initgr(void) /* BGI初始化 */
{
  int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同樣效果 */
  registerbgidriver(EGAVGA_driver);/* 注冊BGI驅動後可以不需要.BGI文件的支持運行 */
  initgraph(&gd, &gm, "");
}
void acrroods()               /*屏幕中心坐標  */
    {
       x0=getmaxx()/2;
       y0=getmaxy()/2;
    }
   void draw_Base_circle()         /*畫圓及寫參數*/
   {
          line(x0-200,y0,x0+200,y0); outtextxy(x0+220,y0,"Z");
          line(x0,y0-180,x0,y0+180); outtextxy(x0+10,y0+180,"X");
          outtextxy(x0-10,y0+10,"O");
          circle(x0,y0,150);
          textcolor(YELLOW);
          directvideo=0;
          gotoxy(46,2);cprintf("Circle start:X0 Y0 Z150");
          gotoxy(46,3);cprintf("Circle end  :X0 Y0 Z150");
          gotoxy(46,4);cprintf("Units       :Pixel");
          gotoxy(46,5);cprintf("Circle now:");
   }
    void close_graph()             /*關圖形系統*/
   {
     closegraph();
   }
   void draw_cabu_circle(int sstep,int Directory)/*關鍵的圓插補函數*/
   {
     int flag=0;
     float Fm,Xm,Ym;
     Xm=x0+150; Ym=y0;
     moveto(Xm,Ym);
     setcolor(RED);
     while(1)   /*分象限,順圓和逆圓討論*/
     {
        Fm=(Xm-x0)/(Xm-x0)+(Ym-y0)/(Ym-y0)-150/150;/*圓判斷公式*/
           if(Fm>=0){
              if(!Directory){  /*逆圓判斷*/
                   if(Xm>=x0&&Ym<=y0)
                       {
                          if(flag)    break;   /*if語句判斷象限,以下一樣*/
                            else       Xm=Xm-sstep;
                        }
                    if(Xm<=x0&&Ym<=y0)
                        {
                          flag=1;      Ym=Ym+sstep;
                        }
                     if(Xm<=x0&&Ym>=y0)
                                          Xm=Xm+sstep;
                     if(Xm>=x0&&Ym>=y0)
                                          Ym=Ym-sstep;
                                  }
             else  {                    /*it is Directory's else*/
                      if(Xm>x0&&Ym<y0)
                                        Ym=Ym+sstep;
                     if(Xm<=x0&&Ym<=y0)
                                         Xm=Xm+sstep;
                     if(Xm<x0&&Ym>y0) {
                            flag=1;     Ym=Ym-sstep;}
                     if(Xm>=x0&&Ym>=y0) {
                             if(flag)  break;
                                          Xm=Xm-sstep;}
                      }
               }
           else{        /*it is Fm's else*/
                if(!Directory) {
                     if(Xm>x0&&Ym<y0)
                       {
                          if(flag)    break;
                            else       Ym=Ym-sstep;
                        }
                    if(Xm<=x0&&Ym<=y0)
                        {
                          flag=1;      Xm=Xm-sstep;
                        }
                     if(Xm<=x0&&Ym>=y0)
                                          Ym=Ym+sstep;
                     if(Xm>=x0&&Ym>=y0)
                                          Xm=Xm+sstep;
                                      }
                else{
                      if(Xm>x0&&Ym<y0)
                                        Xm=Xm+sstep;
                    if(Xm<=x0&&Ym<=y0)
                                         Ym=Ym-sstep;
                     if(Xm<=x0&&Ym>=y0){
                            flag=1;           Xm=Xm-sstep;}
                     if(Xm>=x0&&Ym>=y0) {
                             if(flag)  break;
                                else      Ym=Ym+sstep;}
                   }
             }
           lineto(Xm,Ym);
           gotoxy(58,5); printf("X%3.0f Y0 Z%3.0f     ",Ym-y0,Xm-x0);
           delay(800);
         }
     }
     void circle_demo(int Directory)    /*控制圓插補兩次*/
   {
     int i=0,sstep;
     initgr(); /* BGI初始化 */
     sleep(2);
     acrroods(&x0,&y0);
     for(i=0;i<2;i++)
     {
      draw_Base_circle(150);
       if(i==0){
            sstep=6;
            draw_cabu_circle(sstep,Directory);}
       else{
               sstep=1;
            draw_cabu_circle(sstep,Directory);}
       getch();
       cleardevice();
       setcolor(WHITE);
     }
   }
 /* 圓插補部分的函數區結束*/
int main(void)
{
     int choice=0;
  initgr(); /* BGI初始化 */
  while(choice!=4)
    {
           setfillstyle(1,RED);
           bar(200,30,400,80);
           setcolor(GREEN);
           settextstyle(3,0,10);
           outtextxy(220,50,"DEMO PROGRAM BY P.Y.F");
           setcolor(WHITE);
           settextstyle(0,0,1);
           outtextxy(200,140,"2. Shun_Circle  demo.");
           outtextxy(200,160,"3. Ni_Circle  demo.");
           outtextxy(200,180,"4. Quit the program.");
           outtextxy(160,200,"Please enter your choice:");   gotoxy(46,13);
           scanf("%d",&choice);
    switch(choice)
          {
            case 2:  circle_demo(Ni_circle);break;
            case 3:  circle_demo(Shun_circle);break;
            case 4:  break;
            default: printf("\nChoice wrong,try again!");
          }
    }
  getch(); /* 暫停一下,看看前面繪圖代碼的運行結果 */
  closegr(); /* 恢復TEXT屏幕模式 */
  return 0;
}
具體看看《計算機圖形學》。
『伍』 c語言中如何用line畫一個圓
#include <math.h>
#include <graphics.h>            /*預定義庫函數*/
void circlePoint(int x,int y)    /*八分法畫圓程序*/
{
circle(320+x*20,240+y*20,3);
circle(320+y*20,240+x*20,3);
circle(320-y*20,240+x*20,3);
circle(320-x*20,240+y*20,3);
circle(320-x*20,240+y*20,3);
circle(320-x*20,240-y*20,3);
circle(320-y*20,240-x*20,3);
circle(320+y*20,240-x*20,3);
circle(320+x*20,240-y*20,3);
}
void MidBresenhamcircle(int r)  /* 中點Bresenham演算法畫圓的程序 */
{
int x,y,d;
x=0;y=r;d=1-r;                /* 計算初始值 */
while(x<y)
{ circlePoint(x,y);          /* 繪制點(x,y)及其在八分圓中的另外7個對稱點 */
if(d<0)  d+=2*x+3;         /* 根據誤差項d的判斷,決定非最大位移方向上是走還是不走 */
else
{ d+=2*(x-y)+5;
y--;
}
x++;
delay(900000);
}  /* while */
}
main()
{
int i,j,r,graphmode,graphdriver;
detectgraph(&graphdriver,&graphmode);  initgraph(&graphdriver,&graphmode," ");
printf("中點Bresenhamcircle演算法畫圓的程序\n");     /*提示信息*/
printf("注意 |r|<=11");
printf("\n輸入半徑值 r:");
scanf("%d",&r);
printf("按任意鍵顯示圖形...");
getch();  cleardevice();  setbkcolor(BLACK);
for(i=20;i<=620;i+=20)           /*使用雙循環畫點函數畫出表格中的縱坐標*/
for(j=20;j<=460;j++)
putpixel(i,j,2);
for(j=20;j<=460;j+=20)     &n歡迎光臨學網,收藏本篇文章 [1] [2] 
$False$ 
bsp;     /*使用雙循環畫點函數畫出表格中的橫坐標*/
for(i=20;i<=620;i++)
putpixel(i,j,2);  outtextxy(320,245,"0");                                     /*原點坐標*/
outtextxy(320-5*20,245,"-5");circle(320-5*20,240,2);        /*橫坐標值*/
outtextxy(320+5*20,245,"5");circle(320+5*20,240,2);
outtextxy(320-10*20,245,"-10");circle(320-10*20,240,2);
outtextxy(320+10*20,245,"10");circle(320+10*20,240,2);
outtextxy(320-15*20,245,"-15");circle(320-15*20,240,2);
outtextxy(320+15*20,245,"15");circle(320+15*20,240,2);
outtextxy(320,240-5*20,"-5");circle(320,240-5*20,2);        /*縱坐標值*/
outtextxy(320,240+5*20,"5");circle(320,240+5*20,2);
outtextxy(320,240-10*20,"-10");circle(320,240-10*20,2);
outtextxy(320,240+10*20,"10");circle(320,240+10*20,2);
outtextxy(20,10,"The center of the circle is (0,0) ");    /*坐標軸左上角顯示提示信息*/
setcolor(RED);                 /*標記坐標軸*/
line(20,240,620,240);   outtextxy(320+15*20,230,"X");
line(320,20,320,460);   outtextxy(330,20,"Y");
setcolor(YELLOW);
MidBresenhamcircle(r);
setcolor(BLUE);         /*繪制圓*/
circle(320,240,r*20);
setcolor(2);
getch();  closegraph();
}
『陸』 C++中,中點畫圓演算法,編譯時出現錯誤 ,哪兒錯了
變數y0不是yo
『柒』 C語言繪制圓弧演算法
http://wenku..com/view/a3aa271e227916888486d77e.html
『捌』 C語言用Bresenham演算法畫圓,哪位高手教教,主要是演算法里的內容,謝謝!
的確哈,關鍵在於對delta的理解
可以看到,都是delta=2*(1-radius)這樣的,起作用應該是判斷要畫的點x、y坐標的變化趨勢,先把我注釋了的代碼貼下,加了getch();可以看到畫的過程
-----------------------------------------------------------------
#include<graphics.h>
#include<stdio.h>
void BresenhemCircle(int centerx, int centery, int radius, int color, int type);
void main()
{
  int drive=DETECT,mode;
  int i,j;
  initgraph(&drive,&mode,"");
  BresenhemCircle(300,200,100,15,0);
  getch();
}
void BresenhemCircle(int centerx, int centery, int radius, int color, int type)
{
   int x =type = 0;/*初始橫坐標為原點*/
   int y = radius; /*初始縱坐標遠離原點*/
   int delta = 2*(1-radius);
   int direction;
   while (y >= 0)
   {
      getch();
      if (!type)/*執行*/
      {
         /*在上半圓畫兩點*/
         putpixel(centerx+x, centery+y, color);
         putpixel(centerx-x, centery+y, color);
         /*在下半圓畫兩點*/
         putpixel(centerx-x, centery-y, color);
         putpixel(centerx+x, centery-y, color);
         getch();
      }
      else/*不執行*/
      {
         line(centerx+x, centery+y, centerx+x, centery-y);
         line(centerx-x, centery+y, centerx-x, centery-y);
         getch();
      }
      /*以下代碼設置下次四點的位置,圓是對稱的,且此方法相當於同時畫四個圓弧
        觀察右上方圓弧可知,前一半是x增的要快些,後一半是y減的快些*/
      if (delta < 0)
      {
         if ((2*(delta+y)-1) < 0)
            direction = 1; /*選擇橫向加*/
         else
            direction = 2;
      }
      else if(delta > 0)
      {
         if ((2*(delta-x)-1) > 0)
            direction = 3; /*選擇縱向減*/
         else
            direction = 2;
      }
      else
         direction=2;
  
      switch(direction)
      {
         case 1:
                x++;/*只橫坐標遠離原點*/
                delta += (2*x+1); /*小執行到這,所以加*/
                break;
         case 2:
                x++;
                y--;/*橫向遠離,同時縱向靠近*/
                delta += 2*(x-y+1); /*即(2*x+1)+(-2*y+1)*/
                break;
         case 3:
                y--;/*只縱坐標靠近原點*/
                delta += (-2*y+1); /*大執行到這,所以減*/
                break;
      }
   }
}
『玖』 怎樣用C語言畫圓
#include   <windows.h> 
#include   <string.h> 
#include   <stdio.h> 
#include   <stdlib.h> 
int   main(int   argc,   char*   argv[]) 
{ 
char   arg[50]={0}; 
arg[0]= '\ " '; 
strcpy(arg+1,argv[0]); 
int   len=int(strlen(arg)); 
arg[len]= '\ " '; 
HWND   hWnd=FindWindow(NULL,arg);   //找到程序運行窗口的句柄 
HDC   hDC=GetDC(hWnd);//通過窗口句柄得到該窗口的設備場境句柄 
HPEN   hPen,hOldPen;   //畫筆 
int   i=0; 
for(;i <500;++i) 
SetPixel(hDC,10+i,10+i,0x0000ff);//用畫點的辦法畫一根線,最後一個參數是顏色(32位) 
hPen=CreatePen(PS_SOLID,2,0x00ff00);//生成綠色畫筆 
hOldPen=(HPEN)SelectObject(hDC,hPen);//把畫筆引入設備場境 
MoveToEx(hDC,20,50,NULL);   //設置畫線起點 
LineTo(hDC,520,550);   //畫到終點 
Arc(hDC,100,100,300,300,350,500,350,500);//畫圓 
SelectObject(hDC,hOldPen); 
ReleaseDC(hWnd,hDC); 
//下面是對比,表明它確實是控制台程序 
printf( "hello   console "); 
system( "pause "); 
return   0; 
}
『拾』 bresenham法畫圓的C程序
int Bres(int x0,int y0,double r,int color) 
{ 
int x,y,d; 
x=0; 
y=(int)r; 
d=(int)(3-2*r); 
while(x<y) 
{ 
cirpot(x0,y0,x,y,color); 
if(d<0) 
d+=4*x+6; 
else 
{ 
d+=4*(x-y)+10; 
y--; 
} 
x++; 
} 
if(x==y) 
cirpot(x0,y0,x,y,color); 
return(0); 
} 
int cirpot(int x0,int y0,int x,int y,int color) 
{ 
setcolor(color); 
putxicl((x0+x),(y0+y)); 
putxicl((x0+y),(y0+x)); 
putxicl((x0+y),(y0-x)); 
putxicl((x0+x),(y0-y)); 
putxicl((x0-x),(y0-y)); 
putxicl((x0-y),(y0-x)); 
putxicl((x0-y),(y0+x)); 
putxicl((x0-x),(y0+y)); 
setcolor(color); 
return(0); 
} 
這是圓的演算法,你若要整個程序,把你的電郵給我,我給你發過去、 
運行環境是Turboc 2.0 
int Bresline(int x1,inty1,int x2,int y2,int color) 
{ 
int color,itag; 
int dx,dy,tx,ty,inc1,inc2,d,curx,cury; 
setcolor(color); 
putxicl(x1,y1); 
if(x1==x2&&y1==y2) 
{ 
setcolor(color); 
return(1); 
} 
itag=0; 
dx=abs(x2-x1); 
dy=abs(y2-y1); 
if(dx<dy) 
{ 
itag=1;] 
iswap(&x1,&y1); 
iswap(&x2,&y2); 
iswap(&dx,&dy); 
} 
tx=(x2-x1)>0? 1:-1; 
ty=(y2-y1)>0? 1:-1; 
curx=x1; 
cury=y1; 
inc1=2*dy; 
inc2=2*(dy-dx); 
d=inc1-dx; 
while(curx!x2) 
{ 
if(d<0) 
{ 
d+=inc1; 
} 
else 
{ 
cury+=ty; 
d+=inc2; 
} 
if(itag) 
setpixel(cury,curx);
