中点画圆算法实验报告Word格式.docx
《中点画圆算法实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《中点画圆算法实验报告Word格式.docx(5页珍藏版)》请在冰豆网上搜索。
![中点画圆算法实验报告Word格式.docx](https://file1.bdocx.com/fileroot1/2023-1/8/0741a6ad-eddb-475e-8ccc-f00e5adf0a95/0741a6ad-eddb-475e-8ccc-f00e5adf0a951.gif)
2,计算决策关键参数的初始值,p=5/4-r;
3,在每个xn的位置,从n=0开始,更具决策值p来判断:
如果p 并且执行p=p+2*x+3;
如果p>
=0,下一个点的位置为(xn+1,Yn-1);
并且执行p=p+2.0*(x-y)+5;
4,通过对称原理计算其他7个对称相关点;
5,移动坐标到圆心点(x1,y1)
x=x+x1;
Y=Y+y1;
6,如果x 源代码:
#include
gLintxc=0;
gLintyc=0;
intp[200][200];
classscreenpt
{
private:
gLintx,y;
public:
screenpt(){
x=y=0;
}
voidsetcoords(gLintxcoordValue,gLintycoordValue){
x=xcoordValue;
y=ycoordValue;
gLintgetx()const{
returnx;
gLintgety()const{
returny;
voidincrementx(){
x++;
voiddecrementy(){
y--;
};
voidsetpixel(gLintxcoord,gLintycoord)
p[xcoord][ycoord]=1;
//设置边缘色为1
glbegin(gL_poInTs);
glVertex2i(xcoord,ycoord);
glend();
voidcircleplotpoints(gLintxc,gLintyc,screenptcircpt)
setpixel(xc+circpt.getx(),yc+circpt.gety());
setpixel(xc-circpt.getx(),yc+circpt.gety());
setpixel(xc+circpt.getx(),yc-circpt.gety());
setpixel(xc-circpt.getx(),yc-circpt.gety());
setpixel(xc+circpt.gety(),yc+circpt.getx());
setpixel(xc-circpt.gety(),yc+circpt.getx());
setpixel(xc+circpt.gety(),yc-circpt.getx());
setpixel(xc-circpt.gety(),yc-circpt.getx());
voidcirclemidpoint(gLintradius)
screenptcircpt;
gLintp=1-radius;
circpt.setcoords(0,radius);
voidcircleplotpoints(gLint,gLint,screenpt);
circleplotpoints(xc,yc,circpt);
while(circpt.getx() circpt.incrementx();
if(p p+=2*circpt.getx()+1;
else{
circpt.decrementy();
p+=2*(circpt.getx()-circpt.gety())+1;
voidgetpixel(intx,inty,int
voidsetpixel2(gLintxcoord,gLintycoord)
//p[i][j]=1;
填充色为2
p[xcoord][ycoord]=2;
glcolor3f(0.0,1.0,1.0);
glpointsize(5);
glVertex2f(xcoord,ycoord);
voidboundaryFill4(intx,inty,intfillcolor,intbordercolor)
intinteriorcolor;
getpixel(x,y,interiorcolor);
if((interiorcolor!
=bordercolor)
boundaryFill4(x+1,y,fillcolor,bordercolor);
boundaryFill4(x-1,y,fillcolor,bordercolor);
boundaryFill4(x,y+1,fillcolor,bordercolor);
boundaryFill4(x,y-1,fillcolor,bordercolor);
voidrenderscene(void){
glclear(gL_coLoR_buFFeR_bIT);
gluortho2D(-500,500,-500,500);
glpointsize(3);
circlemidpoint(30);
boundaryFill4(100,100,2,1);
glFlush();
intmain(intargc,char*argv[])
glutInit(
glutInitDisplaymode(gLuT_Rgb|gLuT_sIngLe);
glutInitwindowposition(100,100);
glutInitwindowsize(400,400);
glutcreatewindow("
一个opengL程序"
);
glutDisplayFunc(
glutmainLoop((:
中点画圆算法实验报告));
return0;
运行结果:
实验总结:
这次试验总的来说,就是根据书里的实验思想,再稍加修改就可以得到正确的答案。
我觉得无论做什么,首先要把实验算法的思想了解清楚才能知道自己该怎么做。
开始,我就简单的吧书本里的画圆算法和填充算法拼凑在一起,结果很明显就是错误的,后来拜托别的同学帮我调试程序,就得到了最终的结果,所以看懂书里的程序思想很重要,而不仅仅是敲代码。
篇三:
中点画圆实验报告
中点画圆实验报告
一、实验目的:
用Vc环境实现中点画圆,并显示结果;
二、实验环境:
microsoftVisualc++6.0
三、实验人数:
1人
四、实验内容:
inthuadian(intx0,inty0,intx,inty,intcolor)
putpixel(x+x0,y+y0,Rgb(255,0,0));
putpixel(-x+x0,y+y0,Rgb(255,0,0));
putpixel(-x+x0,-y+y0,Rgb(255,0,0));
putpixel(x+x0,-y+y0,Rgb(255,0,0));
putpixel(y+x0,x+y0,Rgb(255,0,0));
putpixel(-y+x0,x+y0,Rgb(255,0,0));
putpixel(-y+x0,-x+y0,Rgb(255,0,0));
putpixel(y+x0,-x+y0,Rgb(255,0,0));
return(0);
voidhuayuan(intx0,inty0,intr,intcolor)
intx,y,d;
x=0;
y=r;
d=1.25-r;
while(y>
=x)
huadian(x0,y0,x,y,color);
if(d {d=d+2*x+3;
x++;
}
else
{d=d+2*(x-y)+5;
y--;
voidmain()
intr,c=Rgb(255,0,0);
initgraph(640,480);
huayuan(200,200,100,c);
if(getch()==1)
exit;
closegraph();
五、实验步骤:
1、弄清实验原理:
如果我们构造函数F(x,y)=x2+y2-R2,则对于圆上的点有F(x,y)=0,对于圆外的点有F(x,y)>
0,对于圆内的点F(x,y) 若d 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、根据实验原理写出用c语言表示的代码
3、在Vc环境中完善代码;
六、实验过程中遇到的问题及处理方法:
1.调试不出程序,头文件在一些机子上不能检索,所以得安装一个插件
解压,打开点击setup就可解决。
2.在程序调试中有很多次错误,最后发现是没有弄清,函数的主调关系,最后进行了查阅资料,调试出了程序easyx_v20XX0610(beta).zip