# include & ltmath.h & gt
# include & ltgraphics.h & gt/*預定義的庫函數*/
Void circlePoint(int x,int y) /*用八個點畫圓的程序*/
{
圓形(320 x*20,240 y*20,3);
圓形(320 y*20,240 x*20,3);
圓形(320-y*20,240 x*20,3);
圓(320-x*20,240 y*20,3);
圓(320-x*20,240 y*20,3);
圓(320-x*20,240-y*20,3);
圓(320-y*20,240-x*20,3);
圓(320 y*20,240-x*20,3);
圓形(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 & lt;y)
{ circlePoint(x,y);/*在八分圓中繪制點(x,y)及其其他七個對稱點*/
if(d & lt;0)d = 2 * x 3;/*根據對誤差項D的判斷,決定是否往非最大位移方向走*/
其他
{ d = 2 *(x-y)5;
y-;
}
x;
延時(900000);
} /*當*/
}
主()
{
int i,j,r,graphmode,graphdriver
檢測圖(& ampgraph driver & amp;graph mode);
init graph(& amp;graph driver & amp;graphmode,“”;
Printf("用Bresenhamcircle算法畫圓的程序\ n ");/*提示信息*/
Printf ("Note | r |
printf(" \ n輸入半徑值r:");
scanf("%d ",& ampr);
Printf("按任意鍵顯示圖形...");
getch();
clear device();
setbkcolor(黑色);
for(I = 20;我& lt=620;I =20) /*使用雙循環虛線函數在表格中繪制縱坐標*/
for(j = 20;j & lt=460;j)
putpixel(i,j,2);
for(j = 20;j & lt=460;J =20) /*使用雙循環虛線函數*/繪制表格中的橫坐標
for(I = 20;我& lt=620;我)
putpixel(i,j,2);
outtextxy(320,245," 0 ");/*原點坐標*/
outtextxy(320-5*20,245,“-5”);圓(320-5*20,240,2);/*橫坐標值*/
outtextxy(320 5*20,245," 5 ");圓(320 5*20,240,2);
outtextxy(320-10*20,245,"-10 ");圓(320-10*20,240,2);
outtextxy(320 10*20,245," 10 ");圓(320 10*20,240,2);
outtextxy(320-15*20,245,"-15 ");圓(320-15*20,240,2);
outtextxy(320 15*20,245," 15 ");圓(320 15*20,240,2);
outtextxy(320,240-5*20,“-5”);圓(320,240-5*20,2);/*縱坐標值*/
outtextxy(320,240 5*20," 5 ");圓(320,240 5*20,2);
outtextxy(320,240-10*20,"-10 ");圓(320,240-10*20,2);
outtextxy(320,240 10*20," 10 ");圓(320,240 10*20,2);
outtextxy(20,10,“圓心在(0,0)”);/*提示信息顯示在坐標軸的左上角*/
setcolor(紅色);/*標記軸*/
線(20,240,620,240);outtextxy(320 15*20,230," X ");
線(320,20,320,460);outtextxy(330,20," Y ");
setcolor(黃色);
MidBresenhamcircle(r);
setcolor(藍色);/*畫壹個圓*/
圓(320,240,r * 20);
set color(2);
getch();
closegraph();
}
下面這條是直線。
# include & ltgraphics.h & gt
# include & ltmath.h & gt
/*
###############################################################################
功和能:這個函數的作用是通過逐點比較畫壹條直線。
網格:void my line 1 (int x 1,int y 1,int x2,int y2,int color)。
參數說明:x1,y1為起點坐標,x2,y2為終點,color為繪制線條的顏色。
調用示例:myline 1 (10,20,500,440,4)
###############################################################################
*/
void myline1(int x1,int y1,int x2,int y2,int color)
{
/*變量定義開始(添加於2007/10/16) */
int iTx/* X軸或臨時變量終點的相對坐標xa */
int iTy/* Y軸終點的相對坐標ya或臨時變量*/
int iDx/*步長dx*/
int iDy/*步長dy*/
int iFt/*偏差Fm*/
int iSt/*計數周期數(dx+dy)S*/
int iXt/*x方向循環變量xm*/
int iYt/*y方向循環變量ym*/
/*變量定義結束*/
/*變量初始化開始*/
/*如果是第三象限或第四象限,則改為第壹象限或第二象限*/
如果(y2 & lty1)
{
iTx = x 1;
x 1 = x2;
x2 = iTx
iTy = y 1;
y 1 = y2;
y2 = iTy
}
iTx = x2-x 1;/*取X軸的相對坐標*/
iTy = y2-y 1;/*取Y軸的相對坐標*/
iDx = 1;
iDy = 1;
iFt = 0;
iSt = iTx+iTy;
if(iTx & lt;0)iSt =-1 * iTx+iTy;;/*如果在第二象限,X軸方向的步長為負*/
iXt = 0;
iYt = 0;
/*變量初始化結束*/
/*數據處理開始*/
while(iSt & gt;0)
{
putpixel(x1+iXt,y1+iYt,color);
if(iTx & gt;=0) /*如果在第壹象限*/
{
if(iFt & lt;0) /*如果偏差小於0*/
{
iYt+= iDy;/*向Y方向移動壹步*/
iFt+= iTx;
}
否則/*如果偏差大於或等於0*/
{
iXt+= iDx;/*向X方向移動壹步*/
iFt-= iTy;
}
}
其他
{
if(iFt & lt;0) /*如果偏差小於0*/
{
iXt-= iDx;/*向負X方向移動壹步*/
iFt+= iTy;
}
否則/*如果偏差大於或等於0*/
{
iYt+= iDy;/*向Y方向移動壹步*/
iFt+= iTx;
}
}
iSt-;
}
}
/*
###############################################################################
工作能量:這個函數的作用是畫壹條直線。
網格:void myline2 (int x 1,int y 1,int x2,int y2,int color)。
參數說明:x1,y1為起點坐標,x2,y2為終點,color為繪制線條的顏色。
致電示例:myline2(10,20,500,440,4)
###############################################################################
*/
int myline2(int x1,int y1,int x2,int y2,int color)
{
int iX/* x方向的坐標變量*/
int iY/* Y方向的坐標變量*/
int iTx/* X方向的步長變量*/
int iTy/* Y方向的步長變量*/
float fDx/* X方向的差異變量*/
浮動fDy/* Y方向的差異變量*/
float fMinfF*/
float fMaxFF*/
float fS/*端點判斷變量*/
fMinf = 0.5/*f=0.5*/
iX = x 1;
iY = y 1;
putpixel(x1,y1,顏色);
if(x 1 = = x2 & amp;& ampY1==y2) /*如果終點和起點相同*/
{
返回(1);
}
iTx = 1;
iTy = 1;
fDx =(float)(x2-x 1);
fDy =(float)(y2-y 1);
fMaxF = fDy/fDx & gt;0?fDy/fDx:(-fDy/fDx);/*F=|dy/dx|*/
if(fDx & lt;0)iTx =-1;
if(fDy & lt;0)iTy =-1;
fS = fDx & gt0?fDx:(-fDx);
If(fMaxF = = 1)/* If F = 1 */
{
iX = x 1;
iY = y 1;
while(fS & gt;0)
{
iX+= iTx;/*向X方向移動壹步*/
iY+= iTy;/*向Y方向移動壹步*/
putpixel(iX,iY,color);
fS-;
}
}
else if(fMaxF & gt;1)/* If f >;1*/
{
fS+= fDy & gt;0?fDy:(-fDy);
while(fS & gt;0)
{
iY+= iTy;/*向Y方向移動壹步*/
putpixel(iX,iY,color);
FM INF+= 1/fMaxF;/*f=f+1/F*/
fS-;
if(FM INF & gt;= 1)/* If f >;=1*/
{
iX+= iTx;/*向X方向移動壹步*/
FM INF-;/*f=f-1*/
putpixel(iX,iY,color);
fS-;
}
}
}
Else /* If f
{
fS+= fDy & gt;0?fDy:(-fDy);
while(fS & gt;0)
{
iX+= iTx;/*向X方向移動壹步*/
putpixel(iX,iY,color);
FM INF+= fmax f;/*f=f+F*/
fS-;
if(FM INF & gt;= 1)/* If f >;=1*/
{
iY+= iTy;/*向Y方向移動壹步*/
FM INF-;/*f=f-1*/
putpixel(iX,iY,color);
fS-;
}
}
}
}
不懂的可以繼續探討。謝謝妳