绘制直线与圆算法
- 格式:doc
- 大小:75.00 KB
- 文档页数:9
计算机图形学课程实验报告 西安工程大学 理学院 信息与计算科学 2011-3-24 (一)
上机实验1:绘制直线与圆 班级: 08级信息与计算科学01班 姓名: 郝爱虎 学号: 40808010123 上机实验(1)的题目和要求 一、实验目的 掌握直线和圆的生成算法思想,并能上机编程实现相应的算法。 二、实验要求(Direction)
1. 每个学生单独完成。 2. 开发语言规定为C语言。 3. 请在自己的实验报告上写明姓名、学号、班级。 4. 主程序中包括源代码注释。 三、实验题目
实验题1: 实现中点画线法画任意直线。(要求用不同颜色) 测试数据L1 (10,10) (200,10) L2(10,10) (10,200) L3(10,10) (200,150)
L4(10,10) (150,200) L5(10,120) (200,10) L6(10,200) (120,10)
此处写入个人程序: #include MidPointLine(int x0,int y0,int x1, int y1,int color) { int a, b, d1, d2, d, x, y ,temp,flag=0; if((x1-x0)*(y1-y0)==0){ if(y1 == y0){ if(x0>x1){ temp = x0; x0 = x1; x1 = temp; } x = x0; while(x<=x1){ putpixel (x, y0, color); x++; } }else if(x1 == x0){ if(y0>y1){ temp = y0; y0 = y1; y1 = temp; } y = y0; while(y<=y1){ putpixel (x0, y, color); y++; } } }else if((x1-x0)*(y1-y0)>0){ if(x0>x1){ temp = x0; x0 = x1; x1 = temp; temp = y0; y0 = y1; y1 = temp;} if((x1-x0)<(y1-y0)){
temp = y0; y0 = x0; x0 = temp; temp = y1; y1 = x1; x1 = temp; flag = 1; }
}else if((x1-x0)*(y1-y0)<0){ if(x0>x1){ temp = x0; x0 = x1; x1 = temp; temp = y0; y0 = y1; y1 = temp; } if((x1-x0)>(y0-y1)){ y0 = -y0; y1 = -y1; flag = 2; }else if((x1-x0)<(y0-y1)){
x0 = -x0; x1 = -x1; temp = y0; y0 = x0; x0 = temp; temp = y1; y1 = x1; x1 = temp;
temp = x0; x0 = x1; x1 = temp; temp = y0; y0 = y1; y1 = temp; flag = 3; } }/*以上为讨论斜率的各种情形*/
a=y0-y1, b=x1-x0, d=2*a+b; /*划线函数*/ d1=2*a, d2=2*(a+b); x=x0, y=y0; putpixel(x, y, color); while (x{ if (d<0){ x++; y++; d+=d2; } else{ x++; d+=d1; } if(flag==0){ putpixel (x, y, color); }else if(flag==1){ putpixel (y, x, color); }else if(flag==2){ putpixel (-x, y, color); }else if(flag==3){ putpixel (-y, x, color); } } } main() { int gdriver,gmode,lo,hi,x0,y0,x1,y1,color; gdriver=DETECT; /*自动搜索显示器类型和显示模式*/ scanf("%d%d%d%d%d",&x0,&y0,&x1,&y1,&color);/*随即输入线坐标和颜色*/ initgraph(&gdriver,&gmode,""); /*初始化图形系统*/ setbkcolor(1); /*设置背景色*/ MidPointLine(x0, y0, x1, y1, color) ; /*调用函数画线*/ getch(); closegraph(); /*关闭图形回到文本区*/ return(0); }
实验题2:实现Bresenham画线算法画出任意直线段。(用不同颜色) 程序如下: #include Bresenhamline(int x0,int y0,int x1,int y1,int color){ int x, y, dx, dy, e0, i, temp, flag=0; if((x1-x0)*(y1-y0)==0){ if(y1 == y0){ if(x0>x1){ temp = x0; x0 = x1; x1 = temp; } x = x0; while(x<=x1){ putpixel (x, y0, color); x++; } }else if(x1 == x0){ if(y0>y1){ temp = y0; y0 = y1; y1 = temp; } y = y0; while(y<=y1){ putpixel (x0, y, color); y++; } } }else if((x1-x0)*(y1-y0)>0){ if(x0>x1){ temp = x0; x0 = x1; x1 = temp; temp = y0; y0 = y1; y1 = temp; } if((x1-x0)<(y1-y0)){ temp = y0; y0 = x0; x0 = temp; temp = y1; y1 = x1; x1 = temp; flag = 1; }
}else if((x1-x0)*(y1-y0)<0){ if(x0>x1){ temp = x0; x0 = x1; x1 = temp; temp = y0; y0 = y1; y1 = temp;} if((x1-x0)>(y0-y1)){
y0 = -y0; y1 = -y1; flag = 2; }else if((x1-x0)<(y0-y1)){
x0 = -x0; x1 = -x1; temp = y0; y0 = x0; x0 = temp; temp = y1; y1 = x1; x1 = temp;
temp = x0; x0 = x1; x1 = temp; temp = y0; y0 = y1; y1 = temp; flag = 3; } }
dx = x1-x0;dy = y1- y0; e0=-dx; x=x0; y=y0; for (i=0; i<=dx; i++){ if(flag==0){ putpixel (x, y, color); }else if(flag==1){ putpixel (y, x, color); }else if(flag==2){ putpixel (x, -y, color); }else if(flag==3){ putpixel (-y, x, color); } x++; e0=e0+2*dy; if (e0>=0){ y++; e0=e0-2*dx; } } } main() { int gdriver,gmode,lo,hi,x0,y0,x1,y1,color; gdriver=DETECT;/*自动搜索显示器类型和显示模式*/ scanf("%d%d%d%d%d",&x0,&y0,&x1,&y1,&color); /*任意直线坐标和 颜色*/ initgraph(&gdriver,&gmode,"");/*初始化图形系统*/ setbkcolor(1);/*设置背景色*/ Bresenhamline(x0, y0, x1, y1, color) ;/*调用函数*/ getch(); closegraph(); /*关闭图形回到文本*/ return(0); }
实验题3: 实现Bresenham画圆算法画出一个圆心在点(xc,yc), 半径为R, 圆周颜色为color的圆,如下图所示:
要求:圆心的坐标、半径和圆周颜色都要求可以随机输入; X Y
(0,0) (xc,yc) R