#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=0y=rd=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=20i<=620i+=20) /*使用双循环画点函数画出表格中的纵坐标*/
for(j=20j<=460j++)
putpixel(i,j,2)
for(j=20j<=460j+=20) &n欢迎光临学网,收藏本篇文章 [1] [2]
$False$
bsp/*使用双循环画点函数画出表格中的横坐标*/
for(i=20i<=620i++)
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()
}
的确哈,关键在于对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
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)