求:C语言,圆的画法!

发布网友 发布时间:2022-04-22 01:09

我来回答

4个回答

热心网友 时间:2024-08-26 12:18

圆弧的扫描转换算法

(1)圆的特征

圆被定义为到给定中心位置(xc,yc)距离为r的点集。圆心位于原点的圆有四条对称轴x=0,y=0,x=y和x=-y。若已知圆弧上一点(x,y),可以得到其关于四条对称轴的其它7个点,这种性质称为圆的八对称性。因此,只要扫描转换八分之一圆弧,就可以求出整个圆弧的象素集。

圆心在0,0点圆周生成时的对称变换(参见:P.26图3-4)

显示圆弧上的八个对称点的算法:

void CirclePoints(int x,int y,int color)

{

drawpixel(x,y,color); drawpixel(y,x,color);

drawpixel(-x,y,color); drawpixel(y,-x,color);

drawpixel(x,-y,color); drawpixel(-y,x,color);

drawpixel(-x,-y,color); drawpixel(-y,-x,color);

}

(2)中点画圆法(参见:P.29—P.30)

如果我们构造函数 F(x,y)=x2+y2-R2,则对于圆上的点有F(x,y)=0,对于圆外的点有F(x,y)>0,对于圆内的点F(x,y)<0 。与中点画线法一样,构造判别式:

d=F(M)=F(xp+1,yp-0.5)=(xp+1)2+(yp-0.5)2-R2

若 d<0,则应取P1为下一象素,而且再下一象素的判别式为:

d=F(xp+2,yp-0.5)=(xp+2)2+(yp-0.5)2-R2=d+2xp+3

若d≥0,则应取P2为下一象素,而且下一象素的判别式为

d=F(xp+2,yp-1.5)=(xp+2)2+(yp-1.5)2-R2=d+2(xp-yp)+5

我们这里讨论的第一个象素是(0,R),判别式d的初始值为:

d0=F(1,R-0.5)=1.25-R

图2.2.1 当前象素与下一象素的候选者

中点画圆算法:

MidPointCircle(int r int color)

{

int x,y;

float d;

x=0; y=r; d=1.25-r;

circlepoints (x,y,color);

while(x<=y)

{

if(d<0) d+=2*x+3;

else { d+=2*(x-y)+5; y--;}

x++;

circlepoints (x,y,color);

}

}

为了进一步提高算法的效率,可以将上面的算法中的浮点数改写成整数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。

(3)例:半径为6,利用中点画圆法算法所画的点

(4)中点画圆法图示

热心网友 时间:2024-08-26 12:11

#include "Conio.h"
#include "graphics.h"
#define closegr closegraph

void initgr(void) /* BGI初始化 */
{
int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */
registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */
initgraph(&gd, &gm, "");
}

int main(void)
{
initgr(); /* BGI初始化 */
circle(100, 100, 50);
getch(); /* 暂停一下,看看前面绘图代码的运行结果 */
closegr(); /* 恢复TEXT屏幕模式 */
return 0;
}

热心网友 时间:2024-08-26 12:19

头文件 "graphics.h"
main()
{
int driver,mode,x,y,b;
driver=CGA;
mode=CGAC0;
initgraph("&driver,&mode,"");
Circle(100,100,50);在100,100的地方画一个半径为50的圆
getch();
closegraph();
}

热心网友 时间:2024-08-26 12:16

圆都是点组成的,利用循环就可以了。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com